【问题标题】:How can I store references to elements in my XML file? [duplicate]如何在我的 XML 文件中存储对元素的引用? [复制]
【发布时间】:2011-10-31 09:46:47
【问题描述】:

假设我有以下类布局,它定义了公司和产品之间的一对多关系:

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 实例将被复制。当我重新序列化文档时,重复的信息将被重新序列化为两个不同的实例。

由于文档后面会引用公司和产品,因此无法颠倒这种关系。我需要的是某种生成文件的方法,如下所示:

<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 中使用一些东西来解决这个问题,但我似乎无法想出正确的术语来搜索.

【问题讨论】:

  • 谢谢,DataContractSerializer 看起来和我要找的完全一样。

标签: c# .net xml


【解决方案1】:

如果您是直接进行 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
  }
}

【讨论】:

  • 我确实特别说需要反序列化和重新序列化文档,否则就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 2017-08-14
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2011-10-03
相关资源
最近更新 更多