1
[Serializable]
public class ProfilesCollection : ObservableCollection<Profile>
{  
    public ProfilesCollection()
    {            
    }
}

[Serializable]
public class Profile : ObservableCollection<SomeData>
{
    private string _name;        
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged(new PropertyChangedEventArgs("Name"));
        }
    }

    public Profile()
    {
    }
}

[Serializable]
public class SomeData : INotifyPropertyChanged
{
    // some properties

    public SomeData()
    { ... }

    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;

    protected void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
}

XmlSerializer を使用して ProfilesCollection (または Profile) オブジェクトをシリアル化しようとしています。

using (var writer = new StreamWriter("1.xml"))
{
    var xs = new XmlSerializer(typeof(ProfilesCollection));
    xs.Serialize(writer, _profiles);
}

ただし、.xml には Profile クラスにある Name プロパティが含まれていません。それ以外は大丈夫です。それを修正するにはどうすればよいですか?

4

2 に答える 2

2

コレクションをシリアル化するときXmlSerializerは、コレクション クラスの他のプロパティではなく、コレクション内の項目のみを調べます。名前をシリアル化する必要がある場合は、次のようにする必要があります。

public class Profile
{
    private string _name;        
    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            OnPropertyChanged(new PropertyChangedEventArgs("Name"));
        }
    }


    private readonly ObservableCollection<SomeData> _data = new ObservableCollection<SomeData>();
    public ObservableCollection<SomeData> Data
    {
        get { return _data; }
    }

    public Profile()
    {
    }
}

ところで、SerializableおよびNonSerialized属性は によって使用されないXmlSerializerため、それらは必要ありません (イベントはXmlSerializerとにかくによってシリアル化されません)。

于 2012-09-30T12:22:27.180 に答える
0

あなたの 1.xml ファイルは Profile クラスと同じ構造を持つべきだと思います。(名前ノードが必要ですか?)

于 2012-09-30T13:08:13.693 に答える