首页 文章

如何将C#WCF DataContract序列化/反序列化到XML或从XML序列化

提问于
浏览
13

我正在开发一个WCF服务,它将由多个不同的客户端应用程序使用 . 为了使一个功能起作用,服务器需要将XML文件读入C#DataContract,然后将其传递给相关的客户端 . 据我所知,从MSDN网站,这是可能的,但我找不到任何完整的例子 . 特别是,该网站谈到了一个“流”参数,我还没有完成 .

我的数据协定有一个属性字段,它是另一个具有多个简单属性字段的数据协定的列表 .

例如

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

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

我的课看起来像这样 .

3 回答

  • 2

    这是一个例子

    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

    这对你有用 . 当你需要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传递它 .

    您可以使用它将对象包装到_2574879中并通过WCF传输它,在服务器端,您可以轻松地反序列化对象并随意执行任何操作 .

    以下是有关如何正确使用此Serializer的讨论:MSDN Social

    那里也提供了代码片段!

相关问题