2012-06-21 16 views
11

Estoy desarrollando un servicio WCF que será consumido por múltiples aplicaciones cliente diferentes. Para hacer que una funcionalidad funcione, el servidor necesita leer un archivo XML en un C# DataContract que luego se pasa al cliente en cuestión. Por lo que entiendo del sitio web de MSDN, esto es posible, pero no pude encontrar ningún ejemplo completo. En particular, el sitio web habla sobre un parámetro de 'transmisión' que aún no me sale del todo.Cómo serializar/deserializar un C# WCF DataContract a/desde XML

Mi contrato de datos tiene un campo de propiedad que es una lista de otro contrato de datos que tiene múltiples campos de propiedades simples.

p. Ej.

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

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

Mis clases se parecen a esto.

+0

duplicado: http://stackoverflow.com/questions/4858798/datacontract-xml-serialization-and-xml-attributes – DarthVader

Respuesta

13

Aquí es un ejemplo

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"; 
} 
+0

@KirkWoll lo que sí hacer? y ¿qué pasa si solo quiero añadir 1 elemento al archivo XML? – temelm

+0

[de metadatos]: cuando se reemplaza en una clase derivada, escribe la declaración XML con la versión "1.0". Y este código solo escribe 1 objeto en el archivo, si eso es lo que quiere decir. – Bond

+0

escribe un objeto, pero ese objeto es una lista de otros objetos, así que está bien. ¿Qué tal leer un documento XML existente en un contrato de datos? ¿algunas ideas? – temelm

0

Existe la NetDataContractSerializer que resuelve un montón de problemas cuando se utiliza WCF.

ve aquí MSDN NetDataContractSerializer

Se suele utilizar para el embalaje de todo tipo de objetos y pasarlo sobre WCF.

Se puede utilizar para envolver objetos en un byte[] y transportarlo sobre WCF, en el serverside, puede deserializar fácilmente los objetos y hacer lo que quiera con ellos.

Aquí es una discusión sobre cómo utilizar este Serializador correctamente: MSDN Social

Los fragmentos de código se proporcionan también!

+1

WTF, un enlace al sitio ALEMÁN de Microsoft ??? usted probablemente quiere decir: http://msdn.microsoft.com/library/system.runtime.serialization.netdatacontractserializer.aspx – Luuk

2

Esto puede ser útil para usted. Cuando necesitas XElement. Por ejemplo, cuando vaya a agregar un nodo a XDocument o complete XElement de este documento.

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