C# 将对象序列化为XML,仅使用引用ID
我定义了一个包含组件的对象。每个组件都可以包含其他组件作为子组件。大概是这样的:C# 将对象序列化为XML,仅使用引用ID,c#,xml,serialization,C#,Xml,Serialization,我定义了一个包含组件的对象。每个组件都可以包含其他组件作为子组件。大概是这样的: [Serializable] public class Thing { private String name; private List<MyComponent> components; //... } [Serializable] public class MyComponent { private String name; private List<
[Serializable]
public class Thing
{
private String name;
private List<MyComponent> components;
//...
}
[Serializable]
public class MyComponent
{
private String name;
private List<MyComponent> subcomponents;
private String componentID;
//...
}
<Thing>
<ID>TH_001<ID>
<Name>My Test Thing</Name>
<Components>
<MyComponent>
<ComponentID>CMP_001</ComponentID>
<Name>Foo</Name>
</MyComponent>
<MyComponent>
<ComponentID>CMP_002</ComponentID>
<Name>Bar</Name>
<Subcomponents>
<MyComponent>
<ComponentID>CMP_001</ComponentID>
<Name>Foo</Name>
<MyComponent>
</Subcomponents>
</MyComponent>
<MyComponent>
<ComponentID>CMP_003</ComponentID>
<Name>Blergle</Name>
</MyComponent>
<MyComponent>
<ID>CMP_004</ID>
<Name>MasterComponent</Name>
<SubComponents>
<MyComponent>
<ComponentID>CMP_002</ComponentID>
<Name>Bar</Name>
<Subcomponents>
<MyComponent>
<ComponentID>CMP_001</ComponentID>
<Name>Foo</Name>
<MyComponent>
</Subcomponents>
</MyComponent>
<MyComponent>
<ComponentID>CMP_003</ComponentID>
<Name>Blergle</Name>
</MyComponent>
</SubComponents>
</MyComponent>
</Components>
</Thing>
<Thing>
<ID>TH_001<ID>
<Name>My Test Thing</Name>
<Components>
<MyComponent>
<ComponentID>CMP_001</ComponentID>
<Name>Foo</Name>
</MyComponent>
<MyComponent>
<ComponentID>CMP_002</ComponentID>
<Name>Bar</Name>
<Subcomponents>
<MyComponent ID="CMP_001" />
</Subcomponents>
</MyComponent>
<MyComponent>
<ComponentID>CMP_003</ComponentID>
<Name>Blergle</Name>
</MyComponent>
<MyComponent>
<ID>CMP_004</ID>
<Name>MasterComponent</Name>
<SubComponents>
<MyComponent ID="CMP_002" />
<MyComponent ID="CMP_003" />
</SubComponents>
</MyComponent>
</Components>
</Thing>
当我将Thing
类型的对象序列化为XML时,我得到如下结果:
[Serializable]
public class Thing
{
private String name;
private List<MyComponent> components;
//...
}
[Serializable]
public class MyComponent
{
private String name;
private List<MyComponent> subcomponents;
private String componentID;
//...
}
<Thing>
<ID>TH_001<ID>
<Name>My Test Thing</Name>
<Components>
<MyComponent>
<ComponentID>CMP_001</ComponentID>
<Name>Foo</Name>
</MyComponent>
<MyComponent>
<ComponentID>CMP_002</ComponentID>
<Name>Bar</Name>
<Subcomponents>
<MyComponent>
<ComponentID>CMP_001</ComponentID>
<Name>Foo</Name>
<MyComponent>
</Subcomponents>
</MyComponent>
<MyComponent>
<ComponentID>CMP_003</ComponentID>
<Name>Blergle</Name>
</MyComponent>
<MyComponent>
<ID>CMP_004</ID>
<Name>MasterComponent</Name>
<SubComponents>
<MyComponent>
<ComponentID>CMP_002</ComponentID>
<Name>Bar</Name>
<Subcomponents>
<MyComponent>
<ComponentID>CMP_001</ComponentID>
<Name>Foo</Name>
<MyComponent>
</Subcomponents>
</MyComponent>
<MyComponent>
<ComponentID>CMP_003</ComponentID>
<Name>Blergle</Name>
</MyComponent>
</SubComponents>
</MyComponent>
</Components>
</Thing>
<Thing>
<ID>TH_001<ID>
<Name>My Test Thing</Name>
<Components>
<MyComponent>
<ComponentID>CMP_001</ComponentID>
<Name>Foo</Name>
</MyComponent>
<MyComponent>
<ComponentID>CMP_002</ComponentID>
<Name>Bar</Name>
<Subcomponents>
<MyComponent ID="CMP_001" />
</Subcomponents>
</MyComponent>
<MyComponent>
<ComponentID>CMP_003</ComponentID>
<Name>Blergle</Name>
</MyComponent>
<MyComponent>
<ID>CMP_004</ID>
<Name>MasterComponent</Name>
<SubComponents>
<MyComponent ID="CMP_002" />
<MyComponent ID="CMP_003" />
</SubComponents>
</MyComponent>
</Components>
</Thing>
在这种情况下,一个组件只完全定义一次,然后由ID引用。我不太确定如何最好地解决这个问题,或者是否有更好的方法。请查看。它们提供了一系列控制输出的选项。例如,如果要将类属性序列化为属性,只需添加一个XmlAttribute:
[XmlAttribute(AttributeName="id")]
private String componentID;
以后您打算如何使用这个序列化的XML?我不太清楚为什么冗余会成为一个问题…@Baldrick:我正计划将XML转换为HTML,我查看了它的第一个版本,并认为“哦,这会很混乱,为什么我不能通过某种标识符引用现有组件?”。。。我想我应该尝试对第一个XML示例执行转换,但我的直觉反应是“啊!”。过几天我不太累的时候我应该再试一次。