是否有可能使用XmlSerializer將其數據反序列化到類的現有實例中而不是新的實例中?如何使用XmlSerializer反序列化到現有的實例?
這會在兩種情況下會有所幫助:
- 輕鬆合併兩個XML文件合併成一個對象實例。
- 讓對象構造者本身成爲從XML文件加載數據的人。
如果默認情況下不可行,它應該使用反射(在反序列化後複製每個屬性),但這是一個醜陋的解決方案。
是否有可能使用XmlSerializer將其數據反序列化到類的現有實例中而不是新的實例中?如何使用XmlSerializer反序列化到現有的實例?
這會在兩種情況下會有所幫助:
如果默認情況下不可行,它應該使用反射(在反序列化後複製每個屬性),但這是一個醜陋的解決方案。
我認爲你是在正確的軌道與反射想法上。
因爲無論如何你可能有一個包含XML操作的包裝,你可以帶入目標對象,通常將反序列化轉換爲一個新對象,然後通過一個一個地複製只有保存非-默認值。
它不應該那麼複雜才能實現這一點,它會像應用程序的反序列化一樣從應用程序的其他部分看待消費者。
基本上,你不能。 XmlSerializer
是嚴格建設性的。你可以做的唯一有趣的事情是自定義XmlSerializer
是實現IXmlSerializable
並自己做所有事情 - 不是一個有吸引力的選項(它仍然會使用默認構造函數創建新實例等)。
是否對xml
有嚴格要求?如果你可以使用不同的格式,protobuf-net支持合併片段到現有的情況下,簡單,如:
Serializer.Merge(source, obj);
幾周前我遇到了同樣的問題。
我把一個方法Deserialize(字符串序列化形式)在我的實體類實現的ISelfSerializable接口。我也確保接口強制類有一個默認的構造函數。
在我的工廠中,我創建了一個該類型的對象,然後將字符串反序列化爲它。
這不是線程安全的事情......但是你可以這樣做:
[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。