2

BindingList(Floor)から派生するクラスをシリアル化しようとしています。ここで、FloorはプロパティFloor.Heightのみを含む単純なクラスです。

これが私のクラスの簡略版です

[Serializable]
[XmlRoot(ElementName = "CustomBindingList")]
public class CustomBindingList:BindingList<Floor>
{
    [XmlAttribute("publicField")]
    public string publicField;
    private string privateField;

    [XmlAttribute("PublicProperty")]
    public string PublicProperty
    {
        get { return privateField; }
        set { privateField = value; }
    }
}

次のコードを使用して、CustomBindingList のインスタンスをシリアル化します。

XmlSerializer ser = new XmlSerializer(typeof(CustomBindingList));
StringWriter sw = new StringWriter();

CustomBindingList cLIst = new CustomBindingList();

Floor fl;

fl = new Floor();
fl.Height = 10;
cLIst.Add(fl);

fl = new Floor();
fl.Height = 10;    
cLIst.Add(fl);

fl = new Floor();
fl.Height = 10;
cLIst.Add(fl);

ser.Serialize(sw, cLIst);

string testString = sw.ToString();

それでも、上記のtestStringは、次の XML に設定されて終了します。

<CustomBindingList xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
    <Floor Height="10" />
    <Floor Height="10" />
    <Floor Height="10" />
</CustomBindingList>"

「publicField」または「publicPropertyもシリアル化するにはどうすればよいですか?

4

3 に答える 3

3

ここでの簡単な答えは、.NET は通常、何かがコレクションxまたはプロパティを持つことを期待しているということです。これは、いくつかの場所で現れます。

  • xml シリアライゼーション; コレクションのプロパティはシリアル化されません
  • データバインディング; 代わりに暗黙的に最初の項目に移動するため、コレクションのプロパティにデータバインドすることはできません

xml シリアライゼーションの場合、それがクライアントにあるだけかもしれないと考えると理にかなってSomeType[]います...余分なデータはどこに行くのでしょうか?

一般的な解決策は、コレクションをカプセル化することです。

public class MyType : List<MyItemType> // or BindingList<...>
{
    public string Name {get;set;}
}

public class MyType
{
    public string Name {get;set;}
    public List<MyItemType> Items {get;set;} // or BindingList<...>
}

通常、私はseton a collection プロパティを持っていませんが、それをXmlSerializer要求します...

于 2009-08-05T13:12:26.817 に答える
2

XML シリアル化では、特定の方法でコレクションが処理され、コレクションのフィールドやプロパティはシリアル化されず、アイテムのみがシリアル化されます。

次のいずれかを実行できます。

  • IXmlSerializable を実装して、自分で XML を生成および解析します (ただし、多くの作業が必要です)。
  • カスタムフィールドを宣言する別のクラスでBindingListをラップします(spepsで提案されているように)
于 2009-08-05T13:09:29.843 に答える
1

これは、XML シリアル化とコレクションからの継承に関する既知の問題です。

詳細については、こちらをご覧ください。

次のようなものを試すことができます:

[Serializable]
[XmlRoot]
public class CustomBindingList
{
    [XmlAttribute]
    public string publicField;
    private string privateField;

    [XmlAttribute]
    public string PublicProperty
    {
        get { return privateField; }
        set { privateField = value; }
    }

    [XmlElement]
    public BindingList<Floor> Floors = new BindingList<Floor>();
}

これは、Floors.Add を使用してフロアを追加できることを意味します。希望する結果が得られることを願っていますが、試していません。XML シリアライゼーションの鍵は、属性をいじることであることに注意してください。

于 2009-08-05T13:02:22.280 に答える