我想擴展一個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;
}
}
}
你有什麼問題? ObservableCollection沒有實現ISerializable,它只是用SerializableAttribute標記(就像它的基類Collection )。根據你上面的代碼,我期望只有名稱字段/屬性被序列化,因爲你實現了ISerializable。 –
CodeNaked
2011-03-13 02:25:19
實際上恰恰相反。集合中的所有項目都被序列化,但Name屬性沒有。 – JacobJ 2011-03-13 03:21:07
[XmlSerialize具有屬性的自定義集合]的可能重複(http://stackoverflow.com/questions/377486/xmlserialize-a-custom-collection-with-an-attribute) – 2011-03-13 04:37:22