次の方法で共有


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

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

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

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

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>.

要素に新しい名前を付ける場合は、既定の動作を変更できます。 次のコードは、ElementNameXmlElementAttributeプロパティを属性が設定することで、この機能を有効にする方法を示しています。

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

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

配列のシリアル化の制御

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

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は、配列に含まれる項目のシリアル化方法を制御します。

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

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) ドキュメント ファイルを生成することです。 ツールの使用方法の詳細については、「 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 を使用できます。 ただし、型指定されたオブジェクトの配列を返すフィールドを作成する代わりに、1 つの 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 を使用したクラスのシリアル化の制御

クラスには、 XmlRootAttributeXmlTypeAttributeの 2 つの属性のみを適用できます。 これらの属性は似ています。 XmlRootAttributeは、1 つのクラス (シリアル化されるときに XML ドキュメントの開始要素と終了要素、つまりルート要素) を表すクラスにのみ適用できます。 一方、 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 はスキップされます。

こちらも参照ください