少し長い質問ですが、なるべく簡潔にしましたので、ご容赦ください。クラスのバグのように見えXmlSerializer
ますが、Microsoftに提出する前に、見逃したものがあるかどうかを確認したいと思います。これは完全に可能です。
代表的なケースとして次のXMLを生成しようとしています。これは基本的にコレクションのコレクションですが、外部コレクションに追加の要素があります。
<Links>
<Name />
<Group>
<Link />
<Link />
</Group>
<Group>
<Link />
<Link />
</Group>
</Links>
シリアル化クラスは次のとおりです。
public class Link { }
public class Links
{
public string Name { get; set; }
[XmlElement("Group")]
public Link[][] Groups { get; set; }
}
そして、それを実行するための簡単なテストプログラムは次のとおりです。
class Program
{
static void Main()
{
var serializer = new XmlSerializer(typeof(Links));
var links = new Links { Name = "", Groups = new[] {
new[] { new Link(), new Link() },
new[] { new Link(), new Link() } } };
serializer.Serialize(Console.Out, links);
}
}
これは、コレクションの親ノードを削除するために使用XmlElement
するトリックを採用しています。これは、要素が放出されないことを意味し、外部配列(タイプ)に<Groups>
含まれるオブジェクトごとに要素が放出される必要があります。ただし、実行時に、これにより次の例外が発生します。Link[]
<Group>
XmlSerializer
一時クラスを生成できません(result = 1)。エラーCS0030:タイプ「Link [][]」を「Link[]」に変換できませんエラーCS0029:タイプ「Link[]」を「Link[][]」に暗黙的に変換できません
私の推測では、シリアライザーは何らかの理由でコレクションをフラット化しようとしており、タイプが一致しないため、外部配列に含まれるタイプがシリアル化クラスのコンパイルエラーの原因ではないと考えていますLink
。Link[]
どう思いますか?これはバグですか?そして、?を使用した後に私が使用しているXMLを生成するための回避策はありXmlSerializer
ますか?