2012-03-26 10 views
0

これは前に質問されていますが、この特定の問題については問いません。私が読んだほとんどすべての回答は、エンティティフレームワークがシリアル化されていることを処理します。私はMultiValueデータベース(UniVerse)からいくつかの情報を含むActiveRecordパターンに従ってオブジェクトをシリアライズしようとしています。クラスを保持するデータの構造が非常に単純だと思っていましたが、JsonSerializerは循環参照を求めています。循環参照が見つかった場所を見つけました。MVC3 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からにダウンキャストでする必要がある場合は、私はすべての値を扱うことができます単なるラッパークラスですno <T>)、すべてのタイプをnull可能にすることもできます。 TextbookActiveRecord.GetByISBN()から作成されたこのオブジェクトのインスタンスをシリアル化しようとすると、循環参照エラーが発生します。私のDBValueオブジェクトは、テンプレートとしてstring、float、int、またはDateTime以外のクラスを使用していません。

ISerializableインターフェイスを実装し、GetObjectDataメソッドを使用してSerializationInfoオブジェクトにデータを挿入しようとしましたが、例外を使用して、そのメソッドが呼び出されていないように見えています。メソッドの開始は何もしません)。

誰もがこれに間違っている世界を知っていますか?それは静的メソッドか保護されたコンストラクタかもしれませんか?

循環参照を与えている特定のプロパティをどのように見つけることができても、本当に役に立ちます。

答えて

0

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

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