使用DataContractSerializer在对象中反序列化XML

里卡多·维森蒂尼(Ricardo Vicentini)

我有以下xml:

<ArrayOfString>
    <stringValues>
        <stringvalue>teste1</stringvalue>
        <stringList> 
             <stringText>stringList1</stringText>                                   
        </stringList>
    </stringValues>
</ArrayOfString>

我的合同如下:

[KnownType(typeof(StringList))]
[DataContract(Name = "stringValues", Namespace = "")]
public class StringValues
{

    [DataMember(Name="stringvalue",Order=1)]
    public string stringvalue { get; set; }

    [DataMember(Name="stringList",Order=2)]
    public StringList stringList { get; set; }
}

[CollectionDataContract(ItemName = "stringText")]
public class StringList : List<string>
{

}

用于反序列化的代码是:

var testexml = @"<ArrayOfString>
                            <stringValues>
                                <stringvalue>teste1</stringvalue>
                                <stringList> 
                                    <stringText>stringList1</stringText>                                   
                                </stringList>
                            </stringValues>
                         </ArrayOfString>";

        XmlDictionaryReader stringsReader = XmlDictionaryReader.CreateDictionaryReader(XmlReader.Create(new StringReader(testexml)));
        DataContractSerializer ArrayOfString = new DataContractSerializer(typeof(List<StringValues>), "ArrayOfString", "");
        var strings = ArrayOfString.ReadObject(stringsReader);

当我运行它时,stringList属性应该具有一项,但它具有零项。我相信,我的合同出了点问题。有人可以帮忙吗?

提前致谢!

数据库

调试此类反序列化问题的最佳方法是创建一个内存中的类示例,然后将其序列化为字符串,然后将所获得的内容与要反序列化的内容进行比较。如果存在差异,那就是您的错误。

这是显示如何为类创建示例序列化XML的代码:

    private static MemoryStream GenerateStreamFromString(string value)
    {
        return new MemoryStream(Encoding.Unicode.GetBytes(value ?? ""));
    }

    private static string GetXml<T>(T obj, DataContractSerializer serializer) where T : class 
    {
        using (var textWriter = new StringWriter())
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.IndentChars = "    "; // The indentation used in the test string.
            using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
            {
                serializer.WriteObject(xmlWriter, obj);
            }
            return textWriter.ToString();
        }
    }

    public static string GetXml<T>(T obj) where T : class
    {
        DataContractSerializer serializer = new DataContractSerializer(typeof(T));
        return GetXml(obj, serializer);
    }

注意-不是您问题的完整答案,但是代码可能有用,并且注释太长。

更新

好吧,我自己尝试过。您需要将上层类的DataContract上的命名空间设置为与嵌套类的命名空间相同,并且与XML文件本身中给出的命名空间相同:

[CollectionDataContract(ItemName = "stringText", Namespace="")]
public class StringList : List<string>
{

}

如果不这样做,DataContractSerializer将假定它们位于不同的命名空间中,并期望如下所示:

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfstringValues xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <stringValues>
        <stringvalue>teste1</stringvalue>
        <stringList xmlns:d3p1="http://schemas.datacontract.org/2004/07/Clr.Namespace">
            <d3p1:stringText>stringList1</d3p1:stringText>
        </stringList>
    </stringValues>
</ArrayOfstringValues>

Clr.Namespace您在其中定义类的CLR名称空间在哪里(是的,显然在没有任何其他说明的情况下,DataContractSerializer 基于c#名称空间分配了默认名称空间。)

ContractNamespace如果不想重复执行此操作,也可以在整个模块或程序集上使用该属性。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用DataContractSerializer反序列化

使用DataContractSerializer的c#xml反序列化格式未知

使用对象参数反序列化XML

Json to C#反序列化嵌套在对象中的对象

对象xml序列化/反序列化

XML 到对象反序列化

XML反序列化到对象

使用C#中的属性反序列化XML

反序列化ArrayList中的对象

如何使用反序列化的对象?

如何使用XStream序列化/反序列化类型层次结构中的对象?

在 sql server 中序列化使用 OpenJson() 反序列化的对象

在Xamarin中反序列化XML

列表中的XML反序列化

使用列表反序列化xml

如何使用Woodstox StAX 2对XML中的类进行序列化/反序列化

使用 C# 中的注释部分序列化和反序列化 XML

使用 DataContractSerializer 序列化从 List<> 继承的类不会序列化对象属性

使用PHP中的类型将嵌套对象序列化/反序列化为JSON

如何使用DataContractSerializer使用未命名的类型集合反序列化JSON

无法获取DataContractSerializer来反序列化JSON

“在对象未被反序列化时调用了 OnDeserialization 方法。” 从哈希表反序列化

如何使用XmlSerializer在C#中反序列化期间将xml属性转换为自定义对象

WCF 服务导致错误“...”在对象图中可以序列化或反序列化的最大项目数为“65536 ...”在服务器机器中

使用Java和简单XML序列化器/反序列化器反序列化XML文件

使用xsd.exe反序列化-如何反序列化对象而不是DataSet?

春天RestTemplate反序列化的XML对象返回NULL

如何反序列化xml到对象

XML反序列化导致空对象