【发布时间】:2010-10-11 22:41:46
【问题描述】:
我有一组 .net 类,我目前将它们序列化并与一堆其他代码一起使用,因此该 xml 的格式相对固定(格式 #1)。我需要以另一种格式(格式#2)生成 xml,它的结构非常相似,但不完全相同,我想知道最好的方法。
例如,假设这些是我的课程:
public class Resource
{
public string Name { get; set; }
public string Description { get; set; }
public string AnotherField { get; set; }
public string AnotherField2 { get; set; }
public Address Address1 { get; set; }
public Address Address2 { get; set; }
public Settings Settings { get; set; }
}
public class Address
{
public string Line1 { get; set; }
public string Line2 { get; set; }
public string City { get; set; }
}
// This class has custom serialization because it's sort-of a dictionary.
// (Maybe that's no longer needed but it seemed necessary back in .net 2.0).
public class Settings : IXmlSerializable
{
public string GetSetting(string settingName) { ... }
public string SetSetting(string settingName, string value) { ... }
public XmlSchema GetSchema() { return null; }
public void ReadXml(XmlReader reader)
{
// ... reads nested <Setting> elements and calls SetSetting() appropriately
}
public void WriteXml(XmlWriter writer)
{
// ... writes nested <Setting> elements
}
}
我通常使用标准的 XmlSerialization,它会生成很棒的 XML(格式 #1)。类似的东西:
<Resource>
<Name>The big one</Name>
<Description>This is a really big resource</Description>
<AnotherField1>ADVMW391</AnotherField1>
<AnotherField2>green</AnotherField2>
<Address1>
<Line1>1 Park Lane</Line1>
<Line2>Mayfair</Line2>
<City>London</City>
</Address1>
<Address2>
<Line1>11 Pentonville Rd</Line1>
<Line2>Islington</Line2>
<City>London</City>
</Address2>
<Settings>
<Setting>
<Name>Height</Name>
<Value>12.4</Value>
</Setting>
<Setting>
<Name>Depth</Name>
<Value>14.1028</Value>
</Setting>
</Settings>
</Resource>
我要生成的新 XML(格式 #2)看起来像当前的 XML,除了:
现在应该将这些字段表示为设置,而不是字段
AnotherField和AnotherField2。即好像 SetSetting() 在序列化之前被调用了两次,所以这些值在 . 中显示为新元素
而不是字段
Address1和Address2,它们应该表示为包含两个元素的元素。元素应该有一个或两个额外的属性,例如位置和地址类型。
例如
<Resource>
<Name>The big one</Name>
<Description>This is a really big resource</Description>
<Addresses>
<Address>
<Line1>1 Park Lane</Line1>
<Line2>Mayfair</Line2>
<City>London</City>
<Position>1</Position>
<AddressType>Postal</AddressType>
</Address>
<Address>
<Line1>11 Pentonville Rd</Line1>
<Line2>Islington</Line2>
<City>London</City>
<Position>2</Position>
<AddressType>Postal</AddressType>
</Address>
</Addresses>
<Settings>
<Setting>
<Name>Height</Name>
<Value>12.4</Value>
</Setting>
<Setting>
<Name>Depth</Name>
<Value>14.1028</Value>
</Setting>
<Setting>
<Name>AnotherField</Name>
<Value>ADVMW391</Value>
</Setting>
<Setting>
<Name>AnotherField2</Name>
<Value>green</Value>
</Setting>
</Settings>
</Resource>
我可以使用 XmlAttributeOverrides 以这种方式控制序列化吗?否则我应该如何处理它?
请记住,我的真实类的字段数至少是其 10 倍,并且有一些嵌套类我对默认序列化非常满意,因此我想避免过多的手动序列化代码。
可能的选择
我可以看到这些选项:
- 也许可以使用覆盖来控制我关心的属性的序列化?
- 格式 #2 的资源类的自定义序列化,在适当的情况下调用嵌套类的默认序列化。不确定如何处理设置,因为我实际上想添加设置,使用默认值进行序列化,然后删除添加的设置。
- 使用默认序列化创建 xml,然后操作 XML 以进行我需要的更改。 (哎呀!)。
另一个小麻烦是我上面例子中的Resource 实际上有两个子类型,每个子类型都有几个额外的字段。默认的序列化很好地处理了这个问题。任何新方法也需要处理这些子类型的序列化。这意味着我不热衷于让我制作不同的子类型纯粹用于序列化目的的解决方案。
【问题讨论】:
-
您可能想要显示示例 XML 格式
-
是的......我很懒惰,试图避免所有这些打字。
标签: .net serialization xml-serialization