Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在XML文件中存储对元素的引用?_C#_.net_Xml - Fatal编程技术网

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

C# 如何在XML文件中存储对元素的引用?,c#,.net,xml,C#,.net,Xml,假设我有以下类布局,它定义了公司和产品之间的一对多关系: 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; } } 我想将其序列化为X

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

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

由于公司和产品在本文档的后面部分被引用,因此不可能颠倒这种关系。我需要的是生成如下文档的某种方法:

<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>

1.
苹果
1无限循环。。。等
2.
微软
1微软之路。。。等
1.
苹果手机
1.
iMac
2.
XBox 360

我相信我可以自己整理一些专门的收藏来重建这些参考文献,但我真的很想知道解决这个问题的“正确”方法是什么。微软不可能没有想到这一点,所以我必须在.NET中使用一些东西来解决这个问题,但我似乎无法找到正确的搜索术语。

如果您直接进行XML序列化,而只关心出站序列化,然后,您可以将XMLIgnore属性添加到产品中的Manufacturer属性,并添加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
  }
}

如果您正在执行直接的XML序列化,并且只关心出站序列化,则可以向产品中的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
  }
}

谢谢,DataContractSerializer看起来和我要找的一模一样。谢谢,DataContractSerializer看起来和我要找的一模一样。我明确说过我需要对文档进行反序列化和重新序列化,否则就可以了。我明确说过我需要对文档进行反序列化和重新序列化,否则就可以了。