是否有可能使用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。