【问题标题】:Another "preserve reference" XmlSerializer issue另一个“保留参考”XmlSerializer 问题
【发布时间】:2011-09-12 23:24:44
【问题描述】:

我正在研究一种“新语言”(不是那么雄心勃勃)XML 定义,我希望可以选择同时通过 xml(序列化/反序列化)和 API 使用对象图。

public class Project
{
    public List<Connection> Connections  { get; set; }
    public List<Table> Tables { get; set; }

   /* Constructors and more.... */
}

public class Connection
{
    public string Name { get; set; }
    public string ConnectionString { get; set; }

    /* Constructors and more.... */
 }

public class Table
{
    public string TableName { get; set; }
    public Connection Conn { get; set; }
    /* Constructors and more.... */
}

好的,现在我想用类似的方式序列化/反序列化它:

<Project>
 <Connections>
   <Connection Name="MyConnName" ConnectionString="My connection string"\>
 <\Connections>
 <Tables>
   <Table TableName="MyTable" ConnectionName="MyConnName"\>
 <\Tables>
<\Project>

这里有两个问题:

  1. 该类有一个“Conn”属性,它是对一个 Connection 类的引用,但在“语言”(Xml 序列化)中被重命名为“ConnectionName”(我想更改名称以避免混淆纯对象引用(类)和语言“按名称引用”(Xml 序列化)

  2. 如您所见,我想保留参考,但不包括“z.id ??”就像 DataContractSerializer 在 preserveObjectReference 设置为 true 时所做的那样,我想使用“名称”(更易于人类阅读)

有什么想法吗?

【问题讨论】:

    标签: xml serialization reference preserve


    【解决方案1】:

    真的没有很好的方法来扩展XmlSerializer 来做你想做的事,几乎任何有用的“你想要什么”的价值。

    要生成您正在寻找的那种 XML,您必须使用 [XmlIgnore] 装饰 Connection 属性,添加一个 ConnectionName 属性供 XmlSerializer 使用,并找到适当的 Connection在设置ConnectionName 时或之后的某个时间。

    或者,您需要让Table 实现IXmlSerializable完全手动实现生成&lt;Table&gt; 元素的代码。

    【讨论】:

    • 谢谢杰弗里,但我错过了一些东西,如果我添加一个 ConnectionName 属性并尝试在之后找到适当的连接,我将需要定位连接列表(类似于 parent.Connections,其中 parent 是我的项目类) 但是,我怎样才能用 XmlSerializable 获得这个引用,当然我不想把它明确地放在 xml 中,这可能吗?
    • 你不能。解析完成后,您必须在第二遍中解析引用。
    猜你喜欢
    • 2011-09-06
    • 2020-12-15
    • 2011-02-18
    • 2016-04-19
    • 1970-01-01
    • 2018-11-08
    • 2021-05-30
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多