我的应用程序序列化流中的对象。这是我需要的示例:
<links>
<link href="/users" rel="users" />
<link href="/features" rel="features" />
</links>
在这种情况下,对象是“链接”对象的集合。
------------第一版
起初我使用DataContractSerializer,但是您不能将成员序列化为属性(source)
这是对象:
[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 与集合一起使用时,它会欺骗 XmlSerializer(我尝试过,让它找到一个 XmlRootElement 并将其 plurialize 以生成它自己的 XmlRootAttribute,但是在反序列化时会导致问题 + 项目名称仍然保留类名称)
任何想法 ?
在那个问题上真正困扰我的是,我想要的似乎真的非常非常简单......