2009-06-30 1 views
1

は、次のクラス(.NET 3.5)を有する:パブリックプロパティまたはフィールドを持たないパラメータのないコンストラクタを使用するXmlSerializer ...可能ですか?

public class Something 
{ 
    public string Text {get; private set;} 

    private Something() 
    { 
     Text = string.Empty; 
    } 

    public Something(string text) 
    { 
     Text = text; 
    } 
} 

をこれがエラーなしでシリアル化しますが、それは公共のセッターを持っていないので、結果のXMLは、Textプロパティが含まれていません。

XmlSerializerにこれらのプロパティを含める方法がありますか?

答えて

4

XmlSerializerのみ公共の読み取り/書き込みメンバー気遣います。 1つのオプションはIXmlSerializableを実装することですが、それはロットの作業です。より実用的なオプション(利用可能かつ適切な場合には)DataContractSerializerを使用することがあります

[DataContract] 
public class Something 
{ 
    [DataMember] 
    public string Text {get; private set;} 

    private Something() 
    { 
     Text = string.Empty; 
    } 

    public Something(string text) 
    { 
     Text = text; 
    } 
} 

これは、パブリックとプライベートの両方のメンバーに動作しますが、生成されたXMLは、全く同じではない、とあなたはXML属性を指定することはできません。

+0

ありがとうMarc、 これはうまくいくかもしれないが、私はこの属性について知らなかった。あなたが言及した2つの欠点は、それらが唯一のものであるか、他の邪魔されていることですか? –

+0

多くの点で、それは/より良い/シリアライザです(それは新しいものですからそう望みます)が、目的は異なります。 xmlの厳密な制御が必要な場合は柔軟性がありません。しかし、データを直列化したいだけなら、それはうまくいくはずです。またはprotobuf-net; -pを試してください。 –

+0

System.Runtime.Serializationへの参照を追加する必要があります(.NET 3.0から) –

0

いいえ。XMLシリアル化は、公開された読み取り/書き込みフィールドとオブジェクトのプロパティのみをシリアル化します。

-1

 
Try

[Serializable] public class Something { ... }

+0

XmlSerializerは[Serializable]を必要とせず、読み取り専用メンバーをシリアル化するために何もしません。 –

+0

時には[Serializable]が必要です。 –

+0

@Henk:いつ[Serializable]が必要ですか? –

関連する問題