2010-10-10 48 views
0

我想創建自己的xml序列化器類,因爲我需要的其他格式不是System.Xml.Serialization.XmlSerializer。我的想法是將原始類型的屬性(如Integer,Double,String)作爲XmlAttributes處理。有多少個變量指向這個對象,以及哪一個[.net]

要正確實現一個可用的Xml序列化,我需要知道哪些變量指向同一個對象(二進制序列化以這種方式運行)。因爲一個對象只能被序列化一次,以便連接不會丟失。 在XmlSerialisation方面我有這樣的想法,即將類的路徑作爲特殊的XmlAttribute插入。

對於我來說,您是否有過如何處理這種情況?

###編輯

感謝您的答案。
XmlAttributeAttribute可能比編寫我自己的Serializer更有用,因爲只有原始類型的變量(並且有很多變量)應該被序列化爲XmlAttributes。那麼犯了一個錯誤就更可怕了。
我會使用一種哈希解決方案(當然)到目前爲止這麼好。但我的想法是減少這個哈希解決方案的工作,如果我能確保該對象只被引用一次。 你有這樣的問題的鏈接?

回答

3

作爲序列化過程的一部分,您可以在序列化程序中存儲引用。當你需要序列化引用時,查看已經序列化的引用 - 如果你找到它,輸出一個合適的ID(或其他),這樣你可以在反序列化時適當地恢復引用。如果沒有,則序列化對象並記住引用(和關聯的ID),以便在樹中其他位置使用相同的引用時可以發現它。

另一方面,我會努力使用內置的序列化程序,然後提出自己的想法。例如,要將屬性值存儲,可以使用[XmlAttributeAttribute]

+0

對不起,我的誤解。你的意思是......「可以」在「你自己的」序列化器中存儲引用...?或者你在說System.Xml.Serialization.XmlSerializer嗎? – OlimilOops 2010-10-11 04:18:12

+0

無論如何感謝提示/鏈接屬性這個知識我失蹤 – OlimilOops 2010-10-11 04:24:26

+0

@Oops:你只是保留一個'List '(或類似的東西) - 這是假設你正在實現你自己的序列化程序,希望你不需要。 – 2010-10-11 08:24:55

1

您不需要計算指向每個對象的變量數量,以便只序列化每個對象一次。

相反,您可以保留已經序列化的對象列表,並且可以檢查每個新對象是否已經存在於該列表中。您如何比較物體取決於您 - 例如,您可以使用Equals或者您可以使用compare object references

如果您決定使用Equals,那麼您可以獲得更好的性能,因爲您可以將對象存儲在HashSet中。

+0

感謝您的鏈接。由於複雜性原因,HashSet/HashTable/Dictionary比List更好。 (比較每個新舊) – OlimilOops 2010-10-11 04:44:50

1

您可以使用對象的Hashtable並確保您的對象被序列化一次。您可以將該對象的XML表示保存在該值中。然後,您需要使用XML的ref才能重新加載一次。

通常object.ReferenceEquals(o1, o2)會告訴你,如果對象是相同的。

說實話,我不想在你的鞋子裏。這是一個很大的工作,我不確定創建一個從頭開始的串行器是一條路。

+0

謝謝。 「...在你的鞋子裏」是的,我也是;)。我很高興它不一定是那個將軍,而是一個更加特殊的解決方案。我現在只有一半,整個de/serializer大約有167行 – OlimilOops 2010-10-11 04:34:01

相關問題