如何将C# WCF DataContract序列化/反序列化为XML?

13
我正在开发一个WCF服务,将被多个不同的客户端应用程序使用。为了使一个功能工作,服务器需要将一个XML文件读入到一个C# DataContract中,然后将其传递给相关的客户端。据我从MSDN网站了解,这是可能的,但我找不到完整的示例。特别是,该网站提到了一个“stream”参数,我还不太理解。

我的数据契约有一个属性字段,其中包含另一个数据契约的列表,该契约具有多个简单属性字段。

例如:

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

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

我的类看起来像这样。


DataContract XML序列化和XML属性 - DarthVader
3个回答

15

下面是一个例子

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

[从元数据] - 当在派生类中被重写时,使用版本“1.0”编写XML声明。如果这是您的意思,那么此代码仅将1个对象写入文件。 - Ventsyslav Raikov
当我尝试声明FileStream和XmlDictionaryWriter时,如果没有使用'using',它不会写入xml文件。有什么想法吗? - temelm
我理解使用概念,但我手动刷新FileStream并关闭它。仍然不起作用。除了处理之外,还有其他事情吗?实际上,我非常好奇为什么它不起作用:D - temelm
我在问题的末尾添加了一段代码块。我没有关闭写入器。 - temelm
是的,我已经将你的代码添加到答案中了 - 你漏掉了关闭写入器的那一行 - 你必须这样做,否则你写入的数据会留在缓冲区中,而不会被刷新到流中。 - Ventsyslav Raikov
显示剩余5条评论

2

这对您可能很有用。比如说,当您需要XElement时,可以用于向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;
        }

0

有NetDataContractSerializer,它可以解决在使用WCF时遇到的一系列问题。

请参见MSDN NetDataContractSerializer

通常用于包装各种对象并通过WCF传递。

您可以将对象包装成byte[]并通过WCF进行传输, 在服务器端,您可以轻松反序列化对象并对其进行任何操作。

这里讨论了如何正确使用此序列化程序: MSDN Social

代码片段也提供在那里!


4
什么情况,一个指向德国微软网站的链接?你可能想要这个链接:http://msdn.microsoft.com/library/system.runtime.serialization.netdatacontractserializer.aspx。请注意,我会尽力使翻译易于理解,但不会改变原意。 - Luuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接