私のアプリはストリーム内のオブジェクトをシリアル化します。これが私が必要とするもののサンプルです:
<links>
<link href="/users" rel="users" />
<link href="/features" rel="features" />
</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>
-----------2番目のバージョン
わかりました、私が望むものを静かにしないので、私は古典的な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>
-----------第3バージョン
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を生成するようにしましたが、逆シリアル化するときに問題が発生します+アイテム名はクラス名を保持します)
何か案が ?
その問題で本当に気になるのは、私が欲しいものは本当に本当に本当にシンプルに見えるということです...