Share via


属性を使用した XML シリアル化の制御

属性を使用すると、オブジェクトの XML シリアル化を制御したり、同じ一連のクラスから代替 XML ストリームを作成したりできます。 代替 XML ストリームの作成の詳細については、「方法 : XML ストリームの代替要素名を指定する」を参照してください。

注意

生成される XML が、World Wide Web コンソーシアム (W3C) のドキュメント『Simple Object Access Protocol (SOAP) 1.1』のセクション 5 に準拠している必要がある場合は、「エンコード済み SOAP シリアル化を制御する属性」に記載されている属性を使用します。

既定では、クラス名またはメンバー名によって XML 要素名が決まります。 次の例に示すように、Book という名前のクラスでは、ISBN という名前のフィールドから <ISBN> という XML 要素タグが生成されます。

Public Class Book
    Public ISBN As String
End Class
' When an instance of the Book class is serialized, it might
' produce this XML:
' <ISBN>1234567890</ISBN>.
public class Book
{
    public string ISBN;
}
// When an instance of the Book class is serialized, it might
// produce this XML:
// <ISBN>1234567890</ISBN>.

既定の動作を変更して、要素に新しい名前を付けることもできます。 次のコードでは、XmlElementAttributeElementName プロパティを設定することにより、属性でこの機能を実現する方法を示します。

Public Class TaxRates
   < XmlElement(ElementName = "TaxRate")> _
    Public ReturnTaxRate As Decimal
End Class
public class TaxRates {
    [XmlElement(ElementName = "TaxRate")]
    public decimal ReturnTaxRate;
}

属性の詳細については、「属性」を参照してください。 XML シリアル化を制御する属性の一覧については、「Attributes That Control XML Serialization」(XML シリアル化を制御する属性) を参照してください。

配列のシリアル化の制御

XmlArrayAttribute 属性および XmlArrayItemAttribute 属性は、配列のシリアル化を制御します。 この 2 つの属性を使用して、「XML Schema Part 2: Datatypes」というタイトルの W3C ドキュメントで定義されているように、要素名、名前空間、および XML スキーマ (XSD) データ型を制御できます。 また、配列に挿入できる型も指定できます。

XmlArrayAttribute は、配列をシリアル化すると生成される外側の XML 要素のプロパティを決定します。 たとえば、次に示す配列をシリアル化すると、既定で Employees という名前の XML 要素が生成されます。 この Employees 要素は、Employee 配列型に基づいた名前の一連の要素で構成されます。

Public Class Group
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String
End Class
public class Group {
    public Employee[] Employees;
}
public class Employee {
    public string Name;
}

シリアル化されたインスタンスは次のコードのようになります。

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</Employees>
</Group>

XmlArrayAttribute を適用すると、この XML 要素の名前を次のように変更できます。

Public Class Group
    <XmlArray("TeamMembers")> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlArray("TeamMembers")]
    public Employee[] Employees;
}

その結果、次のコードのような XML が生成されます。

<Group>
<TeamMembers>
    <Employee>
        <Name>Haley</Name>
    </Employee>
</TeamMembers>
</Group>

一方、XmlArrayItemAttribute は、配列内の項目をシリアル化する方法を制御します。

Note

この属性は、配列を返すフィールドに適用されます。

Public Class Group
    <XmlArrayItem("MemberName")> _
    Public Employee() As Employees
End Class
public class Group {
    [XmlArrayItem("MemberName")]
    public Employee[] Employees;
}

その結果、次のコードのような XML が生成されます。

<Group>
<Employees>
    <MemberName>Haley</MemberName>
</Employees>
</Group>

派生クラスのシリアル化

XmlArrayItemAttribute のもう 1 つの用途は、派生クラスをシリアル化することです。 たとえば、Manager から派生した Employee という名前の別のクラスを、前の例に追加できます。 XmlArrayItemAttribute を適用しないと、この派生クラス型が認識されないため、実行時にコードが失敗します。 このような結果を回避するには、この属性を 2 回適用し、受け入れ可能な各型 (基本型と派生型) の Type プロパティをそれぞれ設定します。

Public Class Group
    <XmlArrayItem(Type:=GetType(Employee)), _
    XmlArrayItem(Type:=GetType(Manager))> _
    Public Employees() As Employee
End Class
Public Class Employee
    Public Name As String
End Class
Public Class Manager
Inherits Employee
    Public Level As Integer
End Class
public class Group {
    [XmlArrayItem(Type = typeof(Employee)),
    XmlArrayItem(Type = typeof(Manager))]
    public Employee[] Employees;
}
public class Employee {
    public string Name;
}
public class Manager:Employee {
    public int Level;
}

シリアル化されたインスタンスは次のコードのようになります。

<Group>
<Employees>
    <Employee>
        <Name>Haley</Name>
    </Employee>
    <Employee xsi:type = "Manager">
        <Name>Ann</Name>
        <Level>3</Level>
    </Employee>
</Employees>
</Group>

要素のシーケンスとしての配列のシリアル化

次の例に示すように、配列を返すフィールドに XmlElementAttribute を適用して、配列を XML 要素のフラットなシーケンスとしてシリアル化することもできます。

Public Class Group
    <XmlElement> _
    Public Employees() As Employee
End Class
public class Group {
    [XmlElement]
    public Employee[] Employees;
}

シリアル化されたインスタンスは次のコードのようになります。

<Group>
<Employees>
    <Name>Haley</Name>
</Employees>
<Employees>
    <Name>Noriko</Name>
</Employees>
<Employees>
    <Name>Marco</Name>
</Employees>
</Group>

2 つの XML ストリームを区別するもう 1 つの方法は、XML スキーマ定義ツールを使用して、コンパイル済みのコードから XML スキーマ (XSD) ドキュメント ファイルを生成することです ツールの使用の詳細については、「The XML Schema Definition Tool and XML Serialization」(XML スキーマ定義ツールと XML シリアル化) を参照してください。 フィールドに属性を適用しないと、スキーマには次のように要素が記述されます。

<xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />

フィールドに XmlElementAttribute を適用すると、生成されたスキーマには次のように要素が記述されます。

<xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />

ArrayList のシリアル化

ArrayList クラスには、さまざまなオブジェクトのコレクションを含めることができます。 このため、ArrayList は配列とほとんど同じように使用できます。 型指定されたオブジェクトの配列を返すフィールドを作成する代わりに、単一の ArrayList を返すフィールドを作成することもできます。 ただし、配列の場合と同様に、XmlSerializer に含まれるオブジェクトの型を ArrayList に通知する必要があります。 そのためには、次の例に示すように、XmlElementAttribute の複数のインスタンスをフィールドに割り当てます。

Public Class Group
    <XmlElement(Type:=GetType(Employee)), _
    XmlElement(Type:=GetType(Manager))> _
    Public Info As ArrayList
End Class
public class Group {
    [XmlElement(Type = typeof(Employee)),
    XmlElement(Type = typeof(Manager))]
    public ArrayList Info;
}

XmlRootAttribute と XmlTypeAttribute を使用したクラスのシリアル化の制御

1 つのクラスにのみ XmlRootAttributeXmlTypeAttribute の 2 つの属性を適用できます。 これらの属性は非常に似ています。 XmlRootAttribute は、シリアル化されたときに XML ドキュメントの開始要素と終了要素、つまりルート要素を表す 1 つのクラスにのみ適用できます。 一方 XmlTypeAttribute は、ルート クラスを含む任意のクラスに適用できます。

たとえば、前の例では、Group クラスがルート クラスであり、そのすべてのパブリック フィールドとパブリック プロパティは、XML ドキュメント内の XML 要素になります。 したがって、使用するルート クラスは 1 つだけです。 XmlRootAttribute を適用することで、XmlSerializer によって生成される XML ストリームを制御できます。 たとえば、要素名や名前空間を変更できます。

XmlTypeAttribute を使用すると、生成される XML のスキーマを制御できます。 この機能は、XML Web サービスを通じてスキーマを公開する必要がある場合に役立ちます。 次の例では、XmlTypeAttributeXmlRootAttribute の両方を同じクラスに適用しています。

<XmlRoot("NewGroupName"), _
XmlType("NewTypeName")> _
Public Class Group
    Public Employees() As Employee
End Class
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group {
    public Employee[] Employees;
}

このクラスをコンパイルし、XML スキーマ定義ツールを使用してそのスキーマを生成すると、Group を記述する次の XML が生成されます。

<xs:element name="NewGroupName" type="NewTypeName" />

これに対し、クラスのインスタンスをシリアル化した場合は、XML ドキュメントに NewGroupName のみが生成されます。

<NewGroupName>
    . . .
</NewGroupName>

XmlIgnoreAttribute によるシリアル化の回避

パブリック プロパティまたはフィールドをシリアル化する必要がない状況が発生する可能性があります。 たとえば、メタデータの格納に使用しているフィールドまたはプロパティの場合、 XmlIgnoreAttribute を適用すると、XmlSerializer がそのフィールドまたはプロパティをスキップします。

関連項目