7

キャメルケースにアイテムのコレクションをエクスポートする必要があります。このためにラッパーを使用します。

クラス自体:

[XmlRoot("example")]
public class Example
{
    [XmlElement("exampleText")]
    public string ExampleText { get; set; }
}

これは正常にシリアル化されます。

<example>
    <exampleText>Some text</exampleText>
</example>

ラッパー:

[XmlRoot("examples")]
public class ExampleWrapper : ICollection<Example>
{
    [XmlElement("example")]
    public List<Example> innerList;

    //Implementation of ICollection using innerList
}

ただし、これは何らかの理由でラップされたExamplesを大文字にします。これをオーバーライドしようとしましXmlElementたが、これは望ましい効果をもたらさないようです。

<examples>
    <Example>
        <exampleText>Some text</exampleText>
    </Example>
    <Example>
        <exampleText>Another text</exampleText>
    </Example>
</examples>

誰が私が間違っているのか、もっと簡単な方法があるのか​​教えてくれますか?

4

2 に答える 2

5

問題は、コレクションタイプの処理が組み込まれていることです。つまり、タイプが実装された場合、XmlSerializerすべてのプロパティとフィールド(を含む)を無視し、独自のルールに従ってシリアル化するだけです。ただし、 (例で使用したものとは対照的に)属性を使用してコレクションアイテムに使用する要素の名前をカスタマイズできます。innerListICollectionXmlTypeXmlRoot

[XmlType("example")]
public class Example
{
    [XmlElement("exampleText")]
    public string ExampleText { get; set; }
}

これにより、目的のシリアル化が行われます。

http://msdn.microsoft.com/en-us/library/ms950721.aspxを参照してください。具体的には、「コレクションクラスのすべてのプロパティがシリアル化されないのはなぜですか?」という質問に対する回答です。

于 2013-01-03T16:51:31.063 に答える
0

残念ながら、これを実現するために属性だけを使用することはできません。属性のオーバーライドも使用する必要があります。上記のクラスを使用すると、を使用してXmlTypeAttributeクラスの文字列表現をオーバーライドできます。

var wrapper = new ExampleWrapper();
var textes = new[] { "Hello, Curtis", "Good-bye, Curtis" };
foreach(var s in textes)
{
    wrapper.Add(new Example { ExampleText = s });
}

XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attributes = new XmlAttributes();
XmlTypeAttribute typeAttr = new XmlTypeAttribute();
typeAttr.TypeName = "example";
attributes.XmlType = typeAttr;
overrides.Add(typeof(Example), attributes);

XmlSerializer serializer = new XmlSerializer(typeof(ExampleWrapper), overrides);
using(System.IO.StringWriter writer = new System.IO.StringWriter())
{
    serializer.Serialize(writer, wrapper);
    Console.WriteLine(writer.GetStringBuilder().ToString());
}

これは与える

<examples>
  <example>
    <exampleText>Hello, Curtis</exampleText>
  </example>
  <example>
    <exampleText>Good-bye, Curtis</exampleText>
  </example>
</examples>

私はあなたが望んでいたと信じています。

于 2013-01-03T17:07:12.897 に答える