2011-11-28 18 views
3

C#でオブジェクトをシリアル化するには、状態を格納する必要があるすべてのフィールドに対してパブリックプロパティが必要です。C#XMLのシリアル化 - カプセル化を弱めますか?

もしそうなら、それは私のクラスが持っているカプセル化を弱める(完全に破壊しないならば)ので、それほど非常に吸いませんか?

Javaでは、XStreamはすべての非一時フィールドを繰り返し処理してアーカイブすることができます。 C#ではこれが起こることはありません。そして、事態を悪化させるために、辞書のようなものはAT ALLをシリアル化しません。それはすべてちょっと混乱ですね。

私はXStreamの "ポート"用のDLLを見たことがありますが、ドキュメントはありません。疑いがあります。

+0

私はよく覚えている場合、私はゲッターを考えますパブリックではなく、設定者でない必要があります。 – Exort

答えて

3

DataContractSerializerを使用して、シリアル化するすべてのプロパティ/フィールドを[DataMember]でマークする必要があります。あなたのフィールドがプライベートかパブリックかどうかは気にしません。あなたはそれで辞書をシリアル化することができる方法...

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    private string _privateField; 

    [DataMember] 
    public int PublicProperty { get; set;} 
} 

によってシリアライズ:

private static string SerializeXml<T>(T item) 
{ 
    DataContractSerializer ser = new DataContractSerializer(item.GetType()); 

    StringBuilder sb = new StringBuilder(); 
    XmlWriterSettings settings = new XmlWriterSettings { OmitXmlDeclaration = true, ConformanceLevel = ConformanceLevel.Fragment }; 
    using (XmlWriter writer = new XmlWriter(sb, settings)) 
    { 
     ser.WriteObject(writer, item); 
    } 
    return sb.ToString(); 
} 

はXmlSerializerをとDataContractSerializerとの違いについてはこちらをご覧ください:http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/

1

binaryformatterは、プロパティを必要とせずにプライベートフィールドと読み取り専用フィールドをシリアル化します。 XmlSerializerは、引数なしのpublicコンストラクタとパブリックプロパティでのみシリアル化できます。カプセル化を使用してXmlSerializerを使用する場合は、IXmlSerializableを使用できますが、それはむしろ痛いものです。

オブジェクトモデルがかなりシンプルな場合や、シリアライズ(構造体を避けるなど)のために特別なDTOを導入するとかなり簡単にできます。プライベートフィールドやプロパティをシリアル化できるコントラクトベースのシリアライザを使用することをお勧めします。 protobuf-netを見てください。