2013-03-15 113 views
7

我知道我可以使用Linq将字段从XML映射到预先存在的对象中的字段。在.NET Framework(或其他库)中是否有任何功能使这种手动操作变得不那么简单。C# - 使用XML保存现有对象

我还想写(并有HydrateFromXml行为有点像AutoMapper一样):

var myObject = new MyObject(/*ctor args*/); 

myObject = myObject.HydrateFromXml(string xml); 

编辑:

我可以使用Decorator模式或者这里的简单包装对象?直接反序列化为一种抽象包装的类型,该抽象允许我需要的细粒度构造控制?

+1

我做了一些类似的标记与序列化属性的属性。然后编写一个方法来反映已标记的属性,然后在xml中为内容进行挖掘以设置它们。说假设交易者之间没有交叉和水合作用,那么就要讨论它。使用序列化来获得一个然后设置构造函数的参数? – 2013-03-15 14:16:30

+0

在这种情况下,我可能会询问“水合物”是什么意思? – 2013-03-15 14:25:45

+0

@KennethK。我认为这是问题的关键。我希望'myObject'上的属性用XML中的相应值初始化,但这样做意味着告诉程序如何去做。我正在寻找一些不涉及手动映射字段的东西,但看起来这是不可能的。 – Ben 2013-03-15 14:40:54

回答

5

您可以使用XmlSerializer做到这一点:

var serializer = new XmlSerializer(typeof(MyObject)); 

object result; 
using (TextReader reader = new StringReader(xml)) 
{ 
    result= serializer.Deserialize(reader); 
} 

var myObject = result as MyObject; 

对于一个情况,当你的对象实例已经存在检查这个问题:Deserializing properties into a pre-existing object

+0

不需要在最后一行中的“as” - 它只会是一个“ MyObject',所以你可以投。 – 2013-03-15 14:02:16

+2

这似乎没有回答我的问题,因为'result'不预先存在反序列化步骤。我想水合一个预先存在的对象实例。 – Ben 2013-03-15 14:02:52

+0

所以你根本没有'MyObject'声明? – MarcinJuraszek 2013-03-15 14:03:34

1

作为一个快速的选择,你可以使用AutoMapper。使用XmlSerializer反序列化为一个新实例,然后使用AutoMapper从新创建的实例映射到所需的实例。