使用 WCF 反序列化 XML 字符串

Deserialize an XML string with WCF

我在将 XML 字符串反序列化为 C# 对象时遇到问题。问题是我的结果总是空的。这是我的 XML 字符串,存储在一个字符串变量中。

<objects>
  <object>
    <dateadded>1614924419</dateadded>
    <id>CF7E7B22-1D3A-4CFE-91F9-F8C5C2DB4069</id>
    <name>NorthernLights</name>
    <parentid>ED98C97F-A202-48ED-AEEA-34362508A30B</parentid>
    <type>file</type>
  </object>
  <object>
    <dateadded>1614924419</dateadded>
    <id>CF7E7B22-1D3A-4CFE-91F9-F8C5C2DB4070</id>
    <name>Northern</name>
    <parentid>ED98C97F-A202-48ED-AEEA-34362508A30C</parentid>
    <type>file</type>
  </object>
</objects>

这些是我创建的代表 XML 文档的 classes。 我想那里出了点问题。有人可以帮我解决这个问题吗?

这是 objects 标签的 class:

namespace DataContractSample.DataContract.Model
{
    using System.Collections.Generic;
    using System.Runtime.Serialization;

    [DataContract(Name = "objects", Namespace = "", IsReference = false)]
    [KnownType(typeof(IList<Image>))]

    public class Images
    {
        [DataMember(Name = "object", EmitDefaultValue = false, IsRequired = true)]
        public IList<Image> ImageList;
    }
}

这是 object 标签的 class:

namespace DataContractSample.DataContract.Model
{
    using System;
    using System.Runtime.Serialization;

    [DataContract(Name = "object", Namespace = "")]
    public class Image
    {
        [DataMember(Name = "Id")]
        public Guid id { get; set; }

        [DataMember(Name="parentid")]
        public Guid ParentId { get; set; }

        [DataMember(Name="name")]
        public string Name { get; set; }
        
        [DataMember(Name = "type")]
        public string Type { get; set; }

        [DataMember(Name = "dateadded")]
        public string DateAdded { get; set; }
    }
}

谢谢!

你的方法的问题是你想将 <objects> 反序列化为 class 并反序列化为 属性同时。这行不通。在这里,我将介绍两种不同的方法来解决这个问题。

选项 A

如果你在<objects>周围有一个外节点:

<?xml version="1.0" encoding="utf-8" ?>
<top>
  <objects>
    <object>
      <dateadded>1614924419</dateadded>
      <id>CF7E7B22-1D3A-4CFE-91F9-F8C5C2DB4069</id>
      <name>NorthernLights</name>
      <parentid>ED98C97F-A202-48ED-AEEA-34362508A30B</parentid>
      <type>file</type>
    </object>
    <object>
      <dateadded>1614924419</dateadded>
      <id>CF7E7B22-1D3A-4CFE-91F9-F8C5C2DB4070</id>
      <name>Northern</name>
      <parentid>ED98C97F-A202-48ED-AEEA-34362508A30C</parentid>
      <type>file</type>
    </object>
  </objects>
</top>

使用此修改后的顶级实体:

[DataContract(Name = "top", Namespace = "", IsReference = false)]
public class Images
{
    [DataMember(Name = "objects", EmitDefaultValue = false, IsRequired = true)]
    public List<Image> ImageList;
}

然后反序列化就像一个魅力:

using var file = File.OpenRead("sample.xml");
using var reader = new XmlTextReader(file); 
var serializer = new DataContractSerializer(typeof(Images));
var data = (Images)serializer.ReadObject(reader);

Console.WriteLine(data.ImageList.Count); // Will print 2

选项 B

如果 <objects> 周围没有外部节点,则可以使用 CollectionDataContract:

[CollectionDataContract(Name = "objects", Namespace = "")]
public class Images: List<Image>
{

}

它也会起作用:

using var file = File.OpenRead("sample.xml");
using var reader = new XmlTextReader(file); 
var serializer = new DataContractSerializer(typeof(Images));
var data = (Images)serializer.ReadObject(reader);

Console.WriteLine(data.Count); // Will print 2