1. ホーム
  2. c#

[解決済み] オブジェクトの配列をArrayOfXxxxではなく、Xxxxとしてシリアライズします。

2022-01-31 21:08:19

質問

ASP.NET MVCで、MVCContribのXmlResultを使用しています。

Xxxxオブジェクトの配列があり、それをXmlResultに渡しています。

としてシリアライズされる。

<ArrayOfXxxx>
  <Xxxx />
  <Xxxx />
<ArrayOfXxxx>

このようにしたいのですが。

<Xxxxs>
  <Xxxx />
  <Xxxx />
<Xxxxs>

クラスが配列の一部である場合に、どのようにシリアライズされるかを指定する方法はありますか?

すでにXmlTypeを使って表示名を変更していますが、配列の中にあるときにそのグループ名を設定できるような類似のものはないでしょうか。

[XmlType(TypeName="Xxxx")]
public class SomeClass

それとも、このコレクションのためのラッパークラスを追加する必要があるのでしょうか?

どのように解決するのですか?

これは、両方の方法で可能です(ラッパーを使用する、または XmlRoot 属性を付けるか、あるいは XmlAttributeOverrides をシリアライザに追加してください)。

私は、2番目の方法でこれを実装しました。

ここにint型の配列があります。 XmlSerializer を使ってシリアライズしています。

int[] array = { 1, 5, 7, 9, 13 };
using (StringWriter writer = new StringWriter())
{
    XmlAttributes attributes = new XmlAttributes();
    attributes.XmlRoot = new XmlRootAttribute("ints");

    XmlAttributeOverrides attributeOverrides = new XmlAttributeOverrides();
    attributeOverrides.Add(typeof(int[]), attributes);

    XmlSerializer serializer = new XmlSerializer(
        typeof(int[]), 
        attributeOverrides
    );
    serializer.Serialize(writer, array);
    string data = writer.ToString();
}

データ変数(直列化された配列を保持)。

<?xml version="1.0" encoding="utf-16"?>
<ints xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <int>1</int>
  <int>5</int>
  <int>7</int>
  <int>9</int>
  <int>13</int>
</ints>

ということで、代わりに ArrayOfInt となります。 ints をルート名とする。

の詳細はこちら XmlSerializer のコンストラクタは、私が使用したものです。 こちら .