2011-05-12 66 views
3

在我的Silverlight 4應用程序,我救通過DataContractSerializer的XML序列化我的對象 - 這是很容易的:XML序列化和需要公共屬性

public byte[] SerializeModel(ServiceModel model) 
{ 
    System.Runtime.Serialization.DataContractSerializer serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(ServiceModel)); 
    System.IO.MemoryStream ms = new System.IO.MemoryStream(); 

    serializer.WriteObject(ms, model); 

    byte[] bytes = ms.ToArray(); 
    ms.Close(); 

    return bytes; 
} 

...,並通過輕鬆加載它們:

public ServiceModel DeserializeModel(string stream) 
{ 
    System.Runtime.Serialization.DataContractSerializer serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(ServiceModel)); 
    System.Xml.XmlReader reader = System.Xml.XmlReader.Create(new System.IO.StringReader(stream)); 

    object result = serializer.ReadObject(reader); 

    return (ServiceModel)result; 
} 

(錯誤處理中省略)

對我來說,問題是,我需要的數據進行保存(或更好:要加載)與getter和setter的公共屬性。這導致對數據完整性的失控。即我有一個對象集合,我想控制要添加或刪除的對象。我需要繼承或重新實現集合,更改Add和Remove方法以及其他我需要控制的方法。但是使它變得私人使我無法使用DataContractSerializer。

任何建議如何保持簡單但保持對類中的對象的控制?

由於提前,
弗蘭克

+0

你可以不在控制器中控制這個嗎? – 2011-05-12 14:48:07

回答

2

通常我在這種情況下做的,是讓我的序列化對象作爲波蘇斯(只是獲取/套),然後當我反序列化他們,我會盡我所需要的任何額外的檢查根據需要製作並拋出錯誤句柄。

所以這意味着我有我的「接口」序列化,這只是POCO,然後一旦我反序列化它,我做任何一致性檢查和加載/適應我的實體。在我工作的地方,我們使用我們的網絡服務來做到這一點,在那裏我們有我們的域名實體和接口類。一旦我們獲得了請求,我們就會將其調整到我們的業務實體,然後將其傳遞到業務層,並將結果逆轉。

我認爲序列化是跨越一個層,因此所有的輸入都應該被驗證,然後進行調整以保持耦合最小。

但這只是我的0.02美元