0

少し長い質問ですが、なるべく簡潔にしましたので、ご容赦ください。クラスのバグのように見え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[][]」に暗黙的に変換できません

私の推測では、シリアライザーは何らかの理由でコレクションをフラット化しようとしており、タイプが一致しないため、外部配列に含まれるタイプがシリアル化クラスのコンパイルエラーの原因ではないと考えていますLinkLink[]

どう思いますか?これはバグですか?そして、?を使用した後に私が使用しているXMLを生成するための回避策はありXmlSerializerますか?

4

3 に答える 3

1

XmlArrayItem 属性を使用して、ほぼ同じ構造を取得できます。

[XmlArrayItem(ElementName = "Group", Type = typeof(Link[]))]
Link[][] Groups;

しかし、それでも最上位の Groups 要素を取得します。少なくともジャグ配列のシリアル化はこのように機能します。

私のテストに関する限り、XmlElement 属性を取得してジャグ配列を操作する方法はありません。これがバグなのか「機能」なのかはわかりません。エラー メッセージから判断すると、これはバグのように見えます。少なくとも、[][] に [] を入れようとして失敗するのではなく、ギザギザの配列プロパティを持つ XmlElement がサポートされていないことをスローする必要があります。

于 2010-01-18T12:00:47.453 に答える
1

XML に含める構文を定義する XML スキーマを作成し、コード生成ツール (MS xsd.exe など) を使用して、そこから対応するシリアル化コードを生成することをお勧めします。いずれにしても、スキーマを作成することは、データ検証の優れたアプローチです。後で使用するのではなく、自分でコードを維持したい場合でも、少なくとも生成されたコードを見ることができます。

于 2010-01-18T16:57:21.737 に答える
0

私が見たところ、問題はまさにエラーが言っている場所です。

シリアル化しようとしているクラスに必要な XML を記述した方法は、Group が Links のコレクションであることを示しています。ただし、リンクのギザギザの配列 (配列の配列) として定義されています。

単純な配列に戻せば、問題は解決すると思います。


編集して追加

指定した XML が本当に必要な場合は、IXmlSerializableインターフェイスを実装し、自分で XML を作成して読み取ることができます。

物事が期待どおりに機能しない場合は、常にそれが解決策になります。

于 2010-01-18T11:48:07.830 に答える