2009-02-10 65 views
6

是否有可能使用XmlSerializer將其數據反序列化到類的現有實例中而不是新的實例中?如何使用XmlSerializer反序列化到現有的實例?

這會在兩種情況下會有所幫助:

  1. 輕鬆合併兩個XML文件合併成一個對象實例。
  2. 讓對象構造者本身成爲從XML文件加載數據的人。

如果默認情況下不可行,它應該使用反射(在反序列化後複製每個屬性),但這是一個醜陋的解決方案。

回答

1

我認爲你是在正確的軌道與反射想法上。

因爲無論如何你可能有一個包含XML操作的包裝,你可以帶入目標對象,通常將反序列化轉換爲一個新對象,然後通過一個一個地複製只有保存非-默認值。

它不應該那麼複雜才能實現這一點,它會像應用程序的反序列化一樣從應用程序的其他部分看待消費者。

4

基本上,你不能。 XmlSerializer是嚴格建設性的。你可以做的唯一有趣的事情是自定義XmlSerializer是實現IXmlSerializable並自己做所有事情 - 不是一個有吸引力的選項(它仍然會使用默認構造函數創建新實例等)。

是否對xml有嚴格要求?如果你可以使用不同的格式,protobuf-net支持合併片段到現有的情況下,簡單,如:

Serializer.Merge(source, obj); 
0

幾周前我遇到了同樣的問題。

我把一個方法Deserialize(字符串序列化形式)在我的實體類實現的ISelfSerializable接口。我也確保接口強制類有一個默認的構造函數。

在我的工廠中,我創建了一個該類型的對象,然後將字符串反序列化爲它。

0

這不是線程安全的事情......但是你可以這樣做:

[Serializable] 
public class c_Settings 
{ 
    static c_Settings Default; 
    public static SetExistingObject(c_Settings def) 
    { 
     Default = def; 
    } 

    public string Prop1; 
    public bool Prop2; 

    public c_Settings() 
    { 
     if (Default == null) 
      return; 
     MemberInfo[] members = FormatterServices.GetSerializableMembers(typeof(c_Settings)); 
     FormatterServices.PopulateObjectMembers(this, members, FormatterServices.GetObjectData(Default, members)); 
    } 
} 

這樣,你給你的對象解串器及解串器僅覆蓋無論是寫在.XML。

相關問題