【问题标题】:How to serialize an included object/property as a root?如何将包含的对象/属性序列化为根?
【发布时间】:2012-05-23 15:35:11
【问题描述】:

我有一个棘手的问题。假设我有一个名为ObjectHost 的类,包含BusinessObject 类型的属性,它本身包含一些属性(假设NameTown 作为字符串)。 代码是:

public class ObjectHost
{
    public BusinessObject Data { get; set; }

    public ObjectHost()
    {
        Data = null;
    }

    public ObjectHost(BusinessObject ei)
    {
        Data = ei;
    }

    public override string ToString()
    {
        return (Data == null) ? "null" : Data.ToString();
    }
}

序列化时,会产生类似:

<ObjectHost>
  <Data>
    <Name>My name</Name>
    <Town>London</Town>
  </Data>
</ObjectHost>

我希望它在哪里:

<Name>My name</Name>
<Town>London</Town>

因为它只是我特定用途中的封装对象(用于某些其他目的)。

我尝试使用XmlRootXmlElement 属性,但没有达到我的目标。

有解决办法吗?

【问题讨论】:

  • 你目前如何序列化它?
  • 其实ObjectHost对象是其他父对象的属性,都是用XmlSerializer序列化的。

标签: c# xml serialization xml-serialization


【解决方案1】:

据我了解,您正在使用 XmlSerializer 序列化对象。

您正在传入 ObjectHost,并且只希望发出 ObjectHost.BusinessObject 的属性。

您可以使用以下方法之一

  1. 序列化数据的后处理 -> 使用 XPath 查询获取所需数据

    /ObjectHost/Data
    
  2. 自定义序列化过程:(这有点棘手)
    a) 实现 IXmlSerializable
    b) 自定义 ReadXml、WriteXml 和 GetSchema

    在 WriteXml 中,使用 XPath 查询或其他 Xml 方法(获取 XmlNodes)并仅写入所需的属性。
    这种方法将绑定到特定的数据结构,并且不能用于不兼容的数据结构。

【讨论】:

  • 谢谢,我认为这是一个好方法,但你能指出一些 WriteXml/ReadXml 的实施指南吗?实际上,他们有一个 XmlWriter/XmlReader 作为方法参数,应该在其中进行序列化。我不知道我应该使用什么类型的“临时 XmlWriter”来序列化“数据”对象,然后移动到子节点,然后提取它们以将它们放入原始的 XmlWriter WriteXml方法给了我...
猜你喜欢
  • 2015-07-29
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2011-01-28
  • 2019-03-21
相关资源
最近更新 更多