另一个“保存引用”XmlSerializer问题

时间:2011-09-12 23:24:44

标签: xml serialization reference preserve

我正在研究一种“新语言”(不是那种雄心勃勃的)XML定义,我希望能够同时使用对象图víaxml(序列化/反序列化)和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”属性,它是对连接类的引用,但在“语言”(Xml序列化)中重命名为“ConnectionName”(我想更改名称,避免纯粹之间的混淆)对象引用(类)和语言“按名称引用”(Xml seralization)

  2. 如您所见,我想保留引用,但不包括“z.id ??”就像DataContractSerializer在preserveObjectReference设置为true时所做的那样,我想使用“名字”(更加人性化)

  3. 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

实际上没有什么好方法可以扩展XmlSerializer来做你想要的事情,几乎任何有用的“你想要的”价值。

要生成您正在寻找的XML类型,您必须使用Connection修饰[XmlIgnore]属性,为XmlSerializer添加ConnectionName属性以供使用,以及在Connection设置或之后的某个时间找到相应的ConnectionName

或者,您需要Table实施IXmlSerializable完全手工实施生成<Table>元素的代码。