2012-11-22 76 views
0

我試圖讓DataContract Serializer與我的一個類一起工作。DataContractSerializer問題

這就是:

public class MyOwnObservableCollection<T> : ObservableCollection<T>, IDisposable 
    where T : IObjectWithChangeTracker, INotifyPropertyChanged 
{ 
    protected List<T> removedItems; 

    [DataMember] 
    public List<T> RemovedItems 
    { 
    get { return this.removedItems;} 
    set { this.removedItems = value;} 
    } 
    // Other code removed for simplification 
    // ... 
    // 
} 

要明白,當你從的ObservableCollection中刪除項目的RemovedItems列表就會自動填充這一點很重要。

現在序列化使用DataContractSerializer的這個類的一個實例,在下面的代碼中removedItems列表中的一個元素:

<?xml version="1.0" encoding="utf-8"?> 
<ArrayOfTest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="MyNameSpace" /> 

爲什麼:

MyOwnObservableCollection<Test> _Test = new MyOwnObservableCollection<Test>(); 
DataContractSerializer dcs = new DataContractSerializer(typeof(MyOwnObservableCollection<Test>)); 
XmlWriterSettings settings = new XmlWriterSettings() { Indent = true }; 
string fileName = @"Test.xml"; 

Insurance atest = new Test(); 
atest.Name = @"sfdsfsdfsff"; 
_Test.Add(atest); 
_Test.RemoveAt(0); // The Iitem in the ObservableCollection is moved to the RemovedItems List/ 
using (var w = XmlWriter.Create(fileName, settings)) 
{ 
    dcs.WriteObject(w, _Test); 
} 

什麼也沒有在XML文件中結束這個公共財產被忽略?我在這裏錯過了什麼?

TIA。

回答

2

這裏的問題在於你的類是從一個集合派生的,因此,DataContractSerializer只序列化它的項目,但沒有任何額外的屬性,如下所述:No properties when using CollectionDataContract

一種解決方法是使用原來的(繼承)集合爲一個屬性,而不是從它繼承:

public class MyOwnObservableCollection<T> : IDisposable 
    where T : IObjectWithChangeTracker, INotifyPropertyChanged 
{ 
    readonly ObservableCollection<T> originalCollection = new ObservableCollection<T>(); 
    protected List<T> removedItems = = new List<T>(); 

    [DataMember] 
    public List<T> RemovedItems 
    { 
     get { return this.removedItems;} 
     set { this.removedItems = value;} 
    } 

    [DataMember] 
    public ObservableCollection<T> OriginalCollection 
    { 
     get { return this.originalCollection; } 
    } 

    // ... 
} 
+0

你能提供的示例代碼 – toxicate20

+0

良好的漁獲物。我並沒有像使用只讀的ObservableCollection那樣建議強硬。但這個想法在這裏。 –

相關問題