如何在XML文件中存储对元素的引用?

本文关键字:元素 引用 存储 XML 文件 | 更新日期: 2023-09-27 18:12:55

假设我有如下的类布局,它定义了Company和Product之间一对多的关系:

public class Company
{
    public string Name { get; set; }
    public string Address { get; set; }
}
public class Product
{
    public Company Manufacturer { get; set; }
    public string Name { get; set; }
}

我想将其序列化为XML,但不幸的是,Product中的Company实例将被复制。当我重新序列化文档时,重复的信息将被重新序列化为两个不同的实例。

因为Company和Product在文档后面引用,所以不可能颠倒这种关系。我需要的是生成如下文档的方法:

<rootElement>
    <companies>
        <company>
            <id>1</id>
            <name>Apple</name>
            <address>1 Infinite Loop... etc</address>
        </company>
        <company>
            <id>2</id>
            <name>Microsoft</name>
            <address>1 Microsoft Way... etc</address>
        </company>
    </companies>
    <products>
        <product>
            <companyId>1</companyId>
            <name>iPhone</name>
        </product>
        <product>
            <companyId>1</companyId>
            <name>iMac</name>
        </product>
        <product>
            <companyId>2</companyId>
            <name>XBox 360</name>
        </product>
    </products>
</rootElement>

我有信心我可以破解一些专门的集合来重建这些引用,但我真的很想知道解决这个问题的"正确"方法是什么。微软不可能没有想到这一点,所以我必须在。net中使用一些东西来解决这个问题,但我似乎无法提出正确的术语来搜索。

如何在XML文件中存储对元素的引用?

如果您正在进行直接的XML序列化,并且只关心出站序列化,那么您可以向Product中的Manufacturer属性添加XMLIgnore属性,并为序列化添加companyId属性:

[XMLIgnore()]
public Company Manufacturer { get; set; }
public int companyId {
  get {
    return this.Manufacturer.id;
  }
  set {
    // Ignore any updates, only present to support XML serialization
  }
}