2013-10-02 102 views
1

我一直認爲你的域模型不應該負責將自己序列化爲XML。過去我使用過IXmlSerializable接口來控制我的對象是如何序列化的,但理想情況下,我更喜歡序列化的基本功能,以便在對象之外生存。非侵入式XML序列化技術?

然而,我從來沒有能夠以一種乾淨的方式實際實現這一點,我想知道是否有任何模式,我忽略了做到這一點。基本上,我希望我的對象模型能夠做到這一點,並且對XML序列化(或其他任何序列化)沒有任何意義,然後將其交給一些服務,這些服務將對象和序列化爲對象。

我試過用擴展方法來做這件事,但是當你想要序列化一個類型對象的集合時,這會縮短。我已經研究過使用對象包裝器和DTO進行序列化,但是這樣做會導致維護另一組對象,並且當你想要序列化時必須創建這些對象,當你有類型的對象。

唯一的另一件事是使用反射,但我擔心處理開銷。

有沒有一種理智的方式來做我在問什麼,或者我應該咬一口子,讓我的對象xml意識到?

+0

如果你需要性能,XML不是你的格式。 – Gusdor

回答

1

使用System.Xml.Serialization屬性將螺母和螺栓放在代碼之外。您正在定義元數據,但可選參數除外,不需要額外的代碼。實現IXmlSerializable並手動進行序列化很容易出錯,應該避免。爲什麼?你正在定義你的數據3次。

  1. XML架構
  2. 序列化代碼

使用屬性,你可以擦洗步驟3

XML和C#有一個阻抗失配。喜歡與否,在某些時候,您需要定義序列化來創建正確的文檔模型。

可以說,你正在序列化的類不應該執行任何工作。他們只是一個數據存儲。嘗試從序列化的對象中抽象出你的邏輯 - 它可能會給你一種溫暖的感覺。

更新

如果你真的,真的很討厭屬性,嘗試使用適配器模式序列化模型。 XML代碼將位於單獨的類或程序集中,您可以跨存儲介質使用模型。當您更新模型時,您將遭受必須單獨更新序列號的後果。

+0

這可能只是我的一個弱點,但我從未熱衷於裝飾具有屬性的物體。它污染你的代碼庫(imho),並且仍然有效地將你的模型綁定到你的序列化,這正是我想要避免的。 – David

+0

@大衛這是你過去的問題嗎?我很難理解與模式綁定會導致問題的情況。你擔心版本控制嗎? – Gusdor