序列化作为类对象属性的XElement

时间:2017-03-22 20:37:48

标签: c# serialization xelement

我有一个包含XElement对象的类......

public class SomeClass
{
    public string prop1 = "";
    public string prop2 = "";
    public XElement elem = null;
}

我稍后在代码中使用另一个内部定义的类对象的实例设置XElement属性...

UserFields userFields = new UserFields();
SomeClass sc = new SomeClass();
sc.prop1 = "Sam";
sc.prop2 = "Smith";
sc.elem = new XElement("UserFields", userFields);

问题在于,当我使用XmlSerializer将类对象序列化为XML时,我只获得SomeClass.elem属性的完全限定类名...

StringWriter sw = new StringWriter();
XmlSerializer x = new XmlSerializer(o.GetType());
x.Serialize(sw, o);
string xmlString = sw.ToString();

我把它作为输出......

<SomeClass>
    <prop1>Sam</prop1>
    <prop2>Smith</prop2>
    <elem>MyNamespace.UserFields</elem>
</SomeClass>

似乎XmlSerializer不知道如何处理XElement对象。我想找到一种方法来将XElement对象中的XML序列化为XML字符串,就像其他类对象一样。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好的,我找到了答案。问题不在于序列化,而在于类对象对XElement的赋值。由于类对象是您在任何C#项目中定义的普通普通类,因此对XElement的赋值是调用对象的ToString()方法,该方法返回完全限定的类名(是将对象序列化为XML后出现的内容。需要为XElement分配简单类型或其他X类型。在我的情况下,以下完成了所有课程的添加&#39; XElement的属性和后来的序列化按预期工作。

List<XElement> items = new List<XElement>();
FieldInfo[] fields = typeof(UserFields).GetFields();
foreach (FieldInfo fld in fields)
    items.Add(new XElement(fld.Name, fld.GetValue(userFields.Content)));
sc.elem = new XElement("UserFields", items);

返回类似以下内容的内容......

<Root>
    <SomeField>the value</SomeField>
    ...
    <UserFields>  <-- this section is what is generated from the list of XElement objects
        <UserField1>value1</UserField1>
        ...
        <UserFieldN>valueN</UserFieldN>
    </UserFields>
</Root>