デシリアライズ後にプライベートリードオンリフィールドを初期化する必要があります。私はのDataContractをfolowingていますデシリアライズ後にプライベートリードオンリフィールドを初期化する
[DataContract]
public class Item
{
public Item()
{
// Constructor not called at Deserialization
// because of FormatterServices.GetUninitializedObject is used
// so field will not be initialized by constructor at Deserialization
_privateReadonlyField = new object();
}
// Initialization will not be called at Deserialization (same reason as for constructor)
private readonly object _privateReadonlyField = new object();
[DataMember]
public string SomeSerializableProperty { get; set; }
[OnDeserializing]
public void OnDeserializing(StreamingContext context)
{
// With this line code even not compiles, since readonly fields can be initialized only in constructor
_privateReadonlyField = new object();
}
}
私は必要なものすべてを、デシリアライズ_privateReadonlyFieldがnullでないことをした後。
これに関するお勧めはありますか? または「読み取り専用」キーを削除する必要があります。これは適切な選択肢ではありません。
どのようなシリアル化方法を使用していますか?オブジェクトの構成は、さまざまな方法で異なります。 –
あなたの '_privateReadonlyField'に「[DataMember]」と印を付けて間違っていますか?データ契約シリアライザは問題なく処理します。 – dasblinkenlight
Joachim Isaksson:私はDataContractJsonSerializerを使用していますが、実際にはこれは問題ではありません。すべてのシリアライザはデシリアライズ時にFormatterServices.GetUninitializedObjectを使用します。 – Andris