Как сериализовать/десериализовать С# WCF DataContract в/из XML
Я разрабатываю службу WCF, которая будет потребляться несколькими различными клиентскими приложениями. Чтобы сделать одну функциональную работу, сервер должен прочитать XML файл в С# DataContract, который затем передается соответствующему клиенту. Насколько я понимаю с веб-сайта MSDN, это возможно, но я не смог найти никаких полных примеров. В частности, сайт говорит о параметре "поток", который я пока не совсем понял.
У моего контракта данных есть одно поле свойства, которое является списком другого контракта данных, который имеет несколько простых полей свойств.
например.
[DataContract]
public class MyClass1 {
[DataMember]
public string name;
[DataMember]
public int age;
}
[DataContract]
public class MyClass2 {
[DataMember]
public List<MyClass1> myClass1List;
}
Мои классы выглядят примерно так.
Ответы
Ответ 1
Вот пример
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";
}
Ответ 2
Это может быть полезно для вас. Когда вам нужен XElement. Например, когда вы присоедините node к XDocument или загрузите XElement этого документа.
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;
}
Ответ 3
Существует NetDataContractSerializer, который решает целую кучу проблем при использовании WCF.
См. здесь MSDN NetDataContractSerializer
Он обычно используется для обертывания всех видов объектов и передачи его через WCF.
Вы можете использовать его для обертывания объектов в byte[]
и переносить его поверх WCF,
на сервере, вы можете легко десериализовать объекты и делать все
вы хотите с ними.
Ниже приведено обсуждение того, как правильно использовать этот Serializer:
MSDN Social
Здесь также предоставляются фрагменты кода.