0

これは以前に尋ねられましたが、この特定の問題についてではありません。私が読んだほとんどすべての応答は、シリアライズされているエンティティ フレームワークを扱っています。MultiValue データベース (UniVerse) からの情報を含む ActiveRecord パターンに従ってオブジェクトをシリアル化しようとしています。クラスを保持するデータの構造は非常に単純だと思いましたが、JsonSerializer は循環参照を見つけることを主張しており、一生できません。循環参照が見つかった場所を特定します。

私のオブジェクトには、次のような構造があります。

/// <summary>
/// Textbook Active Record
/// </summary>
public class TextbookActiveRecord
{
    public DBValue<string> ISBN { get; private set; }
    public DBValue<string> Synonym { get; private set; }
    public DBValue<DateTime> LastUpdate { get; private set; }
    public DBValue<string> Author { get; private set; }
    public DBValue<string> Title { get; private set; }
    //....up to 70 more properties for some of my tables....

    protected TextbookActiveRecord() { }

    public static TextbookActiveRecord GetByISBN(string isbn)
    {
        //....Creates a new object and fills in the values above...
    }
}

DBValue クラスは単なるラッパー クラスであり、必要に応じて DBValue (<T> なし) にダウンキャストすることにより、すべての値をジェネリックであるかのように扱うことができます。また、すべての型を null 許容にすることもできます。TextbookActiveRecord.GetByISBN() から作成されたこのオブジェクトのインスタンスをシリアル化しようとすると、循環参照エラーが発生します。私の DBValue オブジェクトは、string、float、int、または DateTime 以外のクラスをテンプレートとして使用していません。

ISerializable インターフェイスを実装し、GetObjectData メソッドを使用して SerializationInfo オブジェクトを設定しようとしましたが、例外を使用することで、そのメソッドが呼び出されていないように見えることがわかりました (メソッドの先頭にスローを置く)まったく何もしません)。

これの何が悪いのか誰か知っていますか?それは静的メソッドでしょうか、それとも保護されたコンストラクターでしょうか?

循環参照を与えている特定のプロパティを見つける方法を知っていても、本当に役に立ちます。

4

1 に答える 1

0

メソッドを使用してクラスをシリアライズすることも頭痛の種です。メソッドでlinqを使用することが私の問題でした。

メソッドを削除して拡張メソッドとして追加し、シリアル化された実際のクラスがプロパティのみで構成されるようにすることで、これを回避しました。

于 2012-03-27T04:12:59.437 に答える