2010-01-07 36 views
1

我正在使用IXmlSerializable將特定類型的元素寫入傳出的xml。 我已經實現了模式,並且正在寫出項目。下面的代碼就是一個例子。在IXmlSerializable中查找引用

public void IXmlSerializable.WriteXml(XmlWriter writer) { 
    // Write Out Class. 
    foreach (var item in myItems) { 
    DataContractSerializer ds = new DataContractSerializer(typeof(MyType)); 
    ds.WriteObject(writer, item); 
    } 
} 

我的問題是,MyType的聲明爲使用引用

[DataContract(IsReference = true)] 
public class MyType { ... 

因此,當該項目已被寫入到它需要一個引用的XML。

如何知道引用是否已寫入xml? 我認爲我必須忽略我明確無法控制的引用。這樣我將編寫自己的引用ID並引用我自己的實例。

這顯然是一個糟糕的黑客攻擊,因爲我複製了不應重複的引用。

有沒有什麼辦法找出已經寫了什麼,看看我能否找到已經序列化的物品的ID?

Regards

Craig。

回答

0

「IsReference」魔法僅適用於單個「插曲」內的序列化。一個情節是一個WriteObject調用。

比方說,你有一些頂級類型的頂級對象,象下面這樣:現在

[DC]  
class Container 
    { 
     [DM] 
     MyType i1 = new MyType(); 
     [DM] 
     MyType i2 = i1;; 
     [DM] 
     MyType i3 = i1; 
    } 

,如果你是通過到的writeObject調用序列容器的實例,即是當「ids」和「refs」進場時。當i1被序列化時,它將被序列化爲ID爲1,但是當i2和i3被序列化時,它們每個都被序列化爲具有指向MyType的ID 1的「REF」屬性。

在你的榜樣,因爲每次的writeObject調用是一個單獨的事件,每次通話將序列出整個對象圖。除非你可以將所有不同的MyType實例打包到一個更高級別的對象(甚至集合)中,否則你倒黴。所以這就是你需要做的事情 - 主要強制MyType的所有實例在一個更高級別的WriteObject調用中被序列化。