我的应用程序将对象序列化为流。 这是我所需要的示例:
<links>
<link href="/users" rel="users" />
<link href="/features" rel="features" />
</links>
在这种情况下,该对象是一个'links'对象的集合。
-----------第一个版本
起初我使用了DataContractSerializer,但是你无法将成员序列化为属性 (来源)
以下是该对象:
[DataContract(Name="link")]
public class LinkV1
{
[DataMember(Name="href")]
public string Url { get; set; }
[DataMember(Name="rel")]
public string Relationship { get; set; }
}
这里是结果:
<ArrayOflink xmlns:i="...." xmlns="...">
<link>
<href>/users</href>
<rel>users</rel>
</link>
<link>
<href>/features</href>
<rel>features</rel>
</link>
</ArrayOflink>
----------- 第二个版本
好吧,不是我想要的,所以我尝试了经典的 XmlSerializer,但是...哦不,如果根元素是集合,你不能指定根元素和集合元素的名称...
这是代码:
[XmlRoot("link")]
public class LinkV2
{
[XmlAttribute("href")]
public string Url { get; set; }
[XmlAttribute("rel")]
public string Relationship { get; set; }
}
这是结果:
<ArrayOfLinkV2>
<LinkV2 href="/users" rel="users" />
<LinkV2 href="/features" rel="features" />
<LinkV2 href="/features/user/{keyUser}" rel="featuresByUser" />
</ArrayOfLinkV2>
----------- 第三个版本
使用 XmlSerializer + 根元素:
[XmlRoot("trick")]
public class TotallyUselessClass
{
[XmlArray("links"), XmlArrayItem("link")]
public List<LinkV2> Links { get; set; }
}
并且它的结果为:
<trick>
<links>
<link href="/users" rel="users" />
<link href="/features" rel="features" />
<link href="/features/user/{keyUser}" rel="featuresByUser" />
</links>
</trick>
不错,但我不希望根节点是那个!我想让我的集合成为根节点。
以下是限制条件:
- 序列化代码是通用的,它适用于任何可序列化的内容
- 反向操作(反序列化)也必须正常工作
- 我不想通过正则表达式来处理结果(我直接将其序列化到输出流中)
现在有哪些解决方案:
- 编写自己的XmlSerializer
- 在 XmlSerializer 处理集合时进行小技巧(我尝试过找到一个 XmlRootElement 并将其复数形式以生成自己的 XmlRootAttribute,但这会导致反序列化时出现问题+项目名称仍然保留类名称)
有什么想法吗?
真正困扰我的是这个问题看起来非常非常简单...