Freigeben über


XMLSerializer-Beispiel

Das Beispiel für XmlSerializer veranschaulicht die Serialisierung und Deserialisierung von Typen, die mit dem XmlSerializer kompatibel sind. Der Standardformatierer für Windows Communication Foundation (WCF) ist die DataContractSerializer-Klasse. Die XmlSerializer-Klasse kann auch zum Serialisieren und Deserialisieren von Typen verwendet werden, wenn die DataContractSerializer-Klasse nicht verwendet werden kann. Dies ist oft der Fall, wenn die präzise Steuerung von XML wichtig ist – beispielsweise, wenn es sich bei einem Datenelement um ein XML-Attribut und nicht um ein XML-Element handeln muss. Auch wird der XmlSerializer oft automatisch ausgewählt, wenn Clients für Nicht-WCF-Dienste erstellt werden.

In diesem Beispiel ist der Client eine Konsolenanwendung (.exe), und der Dienst wird von IIS (Internet Information Services, Internetinformationsdienste) gehostet.

Hinweis

Die Setupprozedur und die Buildanweisungen für dieses Beispiel befinden sich am Ende dieses Themas.

Das ServiceContractAttribute und das XmlSerializerFormatAttribute müssen wie im folgenden Beispielcode gezeigt auf die Schnittstelle angewendet werden.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples"), XmlSerializerFormat]
public interface IXmlSerializerCalculator
{
    [OperationContract]
    ComplexNumber Add(ComplexNumber n1, ComplexNumber n2);
    [OperationContract]
    ComplexNumber Subtract(ComplexNumber n1, ComplexNumber n2);
    [OperationContract]
    ComplexNumber Multiply(ComplexNumber n1, ComplexNumber n2);
    [OperationContract]
    ComplexNumber Divide(ComplexNumber n1, ComplexNumber n2);
}

Die öffentlichen Member der ComplexNumber-Klasse werden vom XmlSerializer als XML-Attribute serialisiert. Der DataContractSerializer kann nicht zum Erstellen solcher XML-Instanzen verwendet werden.

public class ComplexNumber
{
    private double real;
    private double imaginary;

    [XmlAttribute]
    public double Real
    {
        get { return real; }
        set { real = value; }
    }

    [XmlAttribute]
    public double Imaginary
    {
        get { return imaginary; }
        set { imaginary = value; }
    }

    public ComplexNumber(double real, double imaginary)
    {
        this.Real = real;
        this.Imaginary = imaginary;
    }
    public ComplexNumber()
    {
        this.Real = 0;
        this.Imaginary = 0;
    }

}

Die Dienstimplementierung berechnet das entsprechende Ergebnis und gibt es zurück. Dabei werden Werte vom Typ ComplexNumber akzeptiert und zurückgegeben.

public class XmlSerializerCalculatorService : IXmlSerializerCalculator
{
    public ComplexNumber Add(ComplexNumber n1, ComplexNumber n2)
    {
        return new ComplexNumber(n1.Real + n2.Real, n1.Imaginary +
                                                      n2.Imaginary);
    }
    …
}

Die Clientimplementierung verwendet ebenfalls komplexe Zahlen. Sowohl der Dienstvertrag als auch die Datentypen sind in der Quelldatei „generatedClient.cs“ definiert, die vom ServiceModel Metadata Utility-Tool (Svcutil.exe) anhand von Dienstmetadaten generiert wird. Svcutil.exe kann erkennen, wenn ein Vertrag nicht mit dem DataContractSerializer serialisierbar ist, und gibt in diesem Fall XmlSerializable-Typen aus. Wenn Sie die Verwendung des XmlSerializer erzwingen möchten, können Sie die Befehlsoption "/serializer:XmlSerializer" (XmlSerializer verwenden) an das Tool "Svcutil.exe" übergeben.

// Create a client.
XmlSerializerCalculatorClient client = new
                         XmlSerializerCalculatorClient();

// Call the Add service operation.
ComplexNumber value1 = new ComplexNumber();
value1.Real = 1;
value1.Imaginary = 2;
ComplexNumber value2 = new ComplexNumber();
value2.Real = 3;
value2.Imaginary = 4;
ComplexNumber result = client.Add(value1, value2);
Console.WriteLine("Add({0} + {1}i, {2} + {3}i) = {4} + {5}i",
    value1.Real, value1.Imaginary, value2.Real, value2.Imaginary,
    result.Real, result.Imaginary);
    …
}

Wenn Sie das Beispiel ausführen, werden die Anforderungen und Antworten für den Vorgang im Clientkonsolenfenster angezeigt. Drücken Sie im Clientfenster die EINGABETASTE, um den Client zu schließen.

Add(1 + 2i, 3 + 4i) = 4 + 6i
Subtract(1 + 2i, 3 + 4i) = -2 + -2i
Multiply(2 + 3i, 4 + 7i) = -13 + 26i
Divide(3 + 7i, 5 + -2i) = 0.0344827586206897 + 1.41379310344828i

Press <ENTER> to terminate client.

So können Sie das Beispiel einrichten, erstellen und ausführen

  1. Stellen Sie sicher, dass Sie die Beispiele zum einmaligen Setupverfahren für Windows Communication Foundation ausgeführt haben.

  2. Um die C#- oder Visual Basic .NET-Edition der Projektmappe zu erstellen, befolgen Sie die unter Building the Windows Communication Foundation Samplesaufgeführten Anweisungen.

  3. Wenn Sie das Beispiel in einer Konfiguration mit einem Computer oder über Computer hinweg ausführen möchten, folgen Sie den Anweisungen unter Durchführen der Windows Communication Foundation-Beispiele.