Klasa XMLSerializer — przykład

W przykładzie XmlSerializer pokazano, jak serializować i deserializować typy zgodne z programem XmlSerializer. Domyślnym formatatorem DataContractSerializer programu Windows Communication Foundation (WCF) jest klasa . Klasa XmlSerializer może służyć do serializacji i deserializacji typów, gdy DataContractSerializer nie można użyć klasy. Jest to często przypadek, gdy wymagana jest dokładna kontrola nad kodem XML — na przykład jeśli element danych musi być atrybutem XML, a nie elementem XML. XmlSerializer Ponadto często są automatycznie wybierane podczas tworzenia klientów dla usług innych niż WCF.

W tym przykładzie klient jest aplikacją konsolową (.exe), a usługa jest hostowana przez usługi Internet Information Services (IIS).

Uwaga

Procedura instalacji i instrukcje kompilacji dla tego przykładu znajdują się na końcu tego tematu.

Element ServiceContractAttribute i XmlSerializerFormatAttribute należy zastosować do interfejsu, jak pokazano w poniższym przykładowym kodzie.

[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);
}

Publiczne elementy członkowskie ComplexNumber klasy są serializowane przez XmlSerializer atrybuty XML. Nie DataContractSerializer można użyć elementu do utworzenia tego rodzaju wystąpienia XML.

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;
    }

}

Implementacja usługi oblicza i zwraca odpowiedni wynik — akceptuje i zwraca wartości ComplexNumber typu.

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

Implementacja klienta używa również liczb złożonych. Zarówno kontrakt usługi, jak i typy danych są zdefiniowane w pliku źródłowym generatedClient.cs, który został wygenerowany przez narzędzie ServiceModel Metadata Utility Tool (Svcutil.exe) z metadanych usługi. Svcutil.exe może wykryć, kiedy kontrakt nie jest serializowalny przez DataContractSerializer element i przywraca emitowanie XmlSerializable typów w tym przypadku. Jeśli chcesz wymusić użycie XmlSerializerpolecenia , możesz przekazać /serializer:XmlSerializer (użyj polecenia XmlSerializer) do narzędzia Svcutil.exe.

// 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);
    …
}

Po uruchomieniu przykładu żądania operacji i odpowiedzi są wyświetlane w oknie konsoli klienta. Naciśnij klawisz ENTER w oknie klienta, aby zamknąć klienta.

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.

Aby skonfigurować, skompilować i uruchomić przykład

  1. Upewnij się, że wykonano procedurę instalacji jednorazowej dla przykładów programu Windows Communication Foundation.

  2. Aby skompilować wersję rozwiązania w języku C# lub Visual Basic .NET, postępuj zgodnie z instrukcjami w temacie Building the Windows Communication Foundation Samples (Tworzenie przykładów programu Windows Communication Foundation).

  3. Aby uruchomić przykład w konfiguracji pojedynczej lub między maszynami, postępuj zgodnie z instrukcjami w temacie Uruchamianie przykładów programu Windows Communication Foundation.