web-dev-qa-db-fra.com

Comment sérialiser/désérialiser un DataContract WCF C # vers/depuis XML

Je développe un service WCF qui sera utilisé par plusieurs applications clientes différentes. Afin de faire fonctionner une fonctionnalité, le serveur doit lire un fichier XML dans un contrat de données C #, qui est ensuite transmis au client concerné. Pour autant que je sache sur le site Web MSDN, cela est possible mais je n’ai pas pu trouver d’exemples complets. En particulier, le site Web parle d'un paramètre de «flux» que je n'ai pas encore bien compris.

Mon contrat de données comporte un champ de propriété, qui est la liste d'un autre contrat de données comportant plusieurs champs de propriété simples.

par exemple.

    [DataContract]
    public class MyClass1 {
        [DataMember]
        public string name;
        [DataMember]
        public int age;
    }

    [DataContract]
    public class MyClass2 {
        [DataMember]
        public List<MyClass1> myClass1List;
    }

Mes cours ressemblent à quelque chose comme ça.

13
temelm

Voici un exemple

MyClass1 obj = new MyClass1();
DataContractSerializer dcs = new DataContractSerializer(typeof(MyClass1));

using (Stream stream = new FileStream(@"C:\tmp\file.xml", FileMode.Create, FileAccess.Write))
{
    using (XmlDictionaryWriter writer = 
        XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8))
    {
        writer.WriteStartDocument();
        dcs.WriteObject(writer, obj);
    }
}

Books b = new Books();

DataContractSerializer dcs = new DataContractSerializer(typeof(Books));

try
{
    Stream fs = new FileStream(@"C:\Users\temelm\Desktop\XmlFile.xml", FileMode.Create, FileAccess.Write);

    XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateTextWriter(fs, Encoding.UTF8);
    xdw.WriteStartDocument();
    dcs.WriteObject(xdw, b);
    xdw.Close();
    fs.Flush();
    fs.Close();
}
catch (Exception e)
{
    s += e.Message + "\n";
}
15
Ventsyslav Raikov

Cela peut être utile pour vous. Quand vous avez besoin de XElement. Par exemple, lorsque vous allez ajouter un noeud à XDocument ou replece XElement de ce document.

private XElement objectToXElement(SomeContractType obj)
        {
            DataContractSerializer dcs = new DataContractSerializer(typeof(SomeContractType);

            var ms = new MemoryStream();
            var xw = XmlWriter.Create(ms);
            dcs.WriteObject(xw, obj);
            xw.Flush();
            xw.Close();
            ms.Position = 0;
            XElement xe = XElement.Load(ms);

            return xe;
        }
2
trueboroda

Il existe NetDataContractSerializer qui résout de nombreux problèmes lors de l’utilisation de WCF.

Voir ici MSDN NetDataContractSerializer

Il est généralement utilisé pour envelopper toutes sortes d'objets et pour le passer sur WCF.

Vous pouvez l'utiliser pour encapsuler des objets dans un byte[] et le transporter via WCF, Sur le serveur, vous pouvez facilement désérialiser les objets et faire ce que vous voulez avec eux.

Voici une discussion sur la façon d’utiliser correctement ce sérialiseur: MSDN Social

Des extraits de code sont fournis là aussi!

0
Mare Infinitus