使用 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
我在将 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