【问题标题】:Serializing an XElement that is a property of a class object序列化作为类对象属性的 XElement
【发布时间】:2017-03-22 20:37:47
【问题描述】:

我有一个包含 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 字符串,就像其他类对象一样。有什么想法吗?

【问题讨论】:

  • [XmlAnyElement] 标记应用于elem 属性是否会产生所需的输出?
  • [XmlAnyElement] 将完成这项工作,例如参见 this answer

标签: c# serialization xelement


【解决方案1】:

好的,我找到了答案。问题不在于序列化,而在于类对象对 XElement 的分配。由于类对象是一个普通的普通类,就像您在任何 C# 项目中定义的那样,对 XElement 的分配是调用对象的 ToString() 方法,该方法返回完全限定的类名(这是出现的在对象被序列化为 XML 之后)。 XElement 需要分配简单类型或其他 X 类型。在我的情况下,以下完成了将所有类的属性添加到 XElement 并且后来的序列化按预期工作。 [XmlAnyElement] 属性不是必需的。

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    相关资源
    最近更新 更多