1

我想擴展一個ObservableCollection幾個自定義屬性,並讓它序列化。但是,我似乎無法讓它序列化這些屬性。我使用的是.NET 4.0,他們修復了ObservableCollection的序列化問題,但仍然有問題。我的直覺是GetObjectData在基類上被調用,而不是我的。有任何想法嗎?爲什麼在序列化ObservableCollection <T>時無法添加屬性?

[Serializable] 
[XmlRoot(ElementName = "MyCollection")] 
public class MyCollection : ObservableCollection<MyItem>, ISerializable 
{ 
    private string name; 

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context) 
    { 
     info.AddValue("Name", Name); 
    } 

    private MyCollection() 
    { 
     Name = string.Empty; 
    } 

    public MyCollection(string name) 
    { 
     Name = name; 
    } 

    public MyCollection(SerializationInfo info, StreamingContext context) 
    { 
     Name = (string)info.GetValue("Name", typeof(string)); 
    } 

    [XmlAttribute] 
    public string Name 
    { 
     get { return name; } 
     protected set 
     { 
      string originalName = name; 
      name = value; 
      if (originalName != name) 
       OnPropertyChanged(new PropertyChangedEventArgs("Name")); 
     } 
    } 

    public void SaveToFile(string path) 
    { 
     string directory = Path.GetDirectoryName(path); 
     if (!Directory.Exists(directory)) 
      Directory.CreateDirectory(directory); 

     XmlSerializer serializer = new XmlSerializer(typeof(MyCollection)); 
     using (TextWriter textWriter = new StreamWriter(path)) 
     { 
      serializer.Serialize(textWriter, this); 
      textWriter.Close(); 
     } 
    } 

    public static MyCollection LoadFromFile(string path) 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(MyCollection)); 
     using (TextReader textReader = new StreamReader(path)) 
     { 
      MyCollection myCollection = (MyCollection)deserializer.Deserialize(textReader); 
      textReader.Close(); 
      return myCollection; 
     } 
    } 
} 
+0

你有什麼問題? ObservableCollection 沒有實現ISerializable,它只是用SerializableAttribute標記(就像它的基類Collection )。根據你上面的代碼,我期望只有名稱字段/屬性被序列化,因爲你實現了ISerializable。 – CodeNaked 2011-03-13 02:25:19

+0

實際上恰恰相反。集合中的所有項目都被序列化,但Name屬性沒有。 – JacobJ 2011-03-13 03:21:07

+1

[XmlSerialize具有屬性的自定義集合]的可能重複(http://stackoverflow.com/questions/377486/xmlserialize-a-custom-collection-with-an-attribute) – 2011-03-13 04:37:22

回答

4

XML序列化不支持這種情況。你根本不能添加任何東西給實施ICollection的課程。

如果您需要這個,那麼您將不得不實施IXmlSerializable並自己完成工作。

請注意,您可能會將XML序列化與運行時序列化混淆。 XML序列化不關心[Serializable]屬性或GetObjectData等。

+0

啊,我明白了。內部收藏使綁定更加繁重。看起來像我將實施我自己的收藏和INotifyCollectionChanged :-( – JacobJ 2011-03-13 23:51:04

相關問題