XMLSerializer 异常“存在错误反映字段”和“对于非数组类型,您可以使用以下属性:XmlAttribute,..”

Posted

技术标签:

【中文标题】XMLSerializer 异常“存在错误反映字段”和“对于非数组类型,您可以使用以下属性:XmlAttribute,..”【英文标题】:XMLSerializer exceptions "There was an error reflecting field" and "For non-array types, you may use the following attributes: XmlAttribute, .." 【发布时间】:2021-12-06 16:02:09 【问题描述】:

请耐心等待,因为我是新手。 我需要将 JSON 字符串转换为 XML 进行一些修改 来自

"computerid":123456,"computername":"mycomputer","computermodel":"mymodel"

<?xml version="1.0"?>
<SqlMultiFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Parameter>
<Filter>
    <ParamName>computerid</ParamName>
    <ParamValues>
        <ParamValue>123456</ParamValue>
    </ParamValues>
</Filter>
<Filter>
    <ParamName>computername</ParamName>
    <ParamValues>
        <ParamValue>mycomputer</ParamValue>
    </ParamValues>
</Filter>
<Filter>
    <ParamName>computermodel</ParamName>
    <ParamValues>
        <ParamValue>mymodel</ParamValue>
    </ParamValues>
</Filter>
</Parameter>
</SqlMultiFilter>

我以这种方式创建了一个公共课程

[XmlRoot("SQLMultiFilter", Namespace = "http://www.cpandl.com",
    IsNullable = false)]
    public class SQLMultiFilter
    
        [XmlArrayAttribute("Parameter")]
        public string ParamName;
        [XmlArrayAttribute("ParamValues")]
        public string ParamValue;
    

当我发布我的 json 时,我收到了错误

XmlSerializer serializer = new XmlSerializer(typeof(SQLMultiFilter));

错误

Inner Exception 1:
InvalidOperationException: There was an error reflecting field 'ParamName'.

Inner Exception 2:
InvalidOperationException: For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement.

我哪里出错了?

提前致谢

【问题讨论】:

XmlArrayAttribute 指定 XmlSerializer 必须将特定类成员序列化为 XML 元素数组。您的班级没有数组。试试 XmlElementAttribute。 @Zserbinator :那么,我必须如何编写 SQLMultiFilter 类?我的意思是,Filter 似乎是一个数组,也是 ParamValues.. 还是不是? 为什么会有如此复杂的 XML 格式?为什么不这样做:&lt;Filter computerid="123456" computername="mycomputer" computermodel="mymodel" /&gt;. @AlexanderPetrov 我必须与几个接受该类型 XML 的存储过程进行交互 :( 【参考方案1】:
[XmlRoot("SQLMultiFilter", Namespace = "http://www.cpandl.com", IsNullable = false)]
public class SqlMultiFilter

    public List<Filter> Parameter  get; set; 


public class Filter

    public string ParamName;

    [XmlArrayItem("ParamValue")]
    public List<string> ParamValues  get; set; 

这两个类将允许您重现所示架构的 XML。

var serializer = new XmlSerializer(typeof(SqlMultiFilter));

var sqlMultiFilter = new SqlMultiFilter

    Parameter = new List<Filter>
    
        new Filter  ParamName = "computerid", ParamValues = new List<string>  "123456"  ,
        new Filter  ParamName = "computername", ParamValues = new List<string>  "mycomputer"  ,
        new Filter  ParamName = "computermodel", ParamValues = new List<string>  "mymodel"  
    
;

var settings = new XmlWriterSettings  Indent = true ;

using (var xmlWriter = XmlWriter.Create(Console.Out, settings))
    serializer.Serialize(xmlWriter, sqlMultiFilter);

会给出想要的结果。

【讨论】:

以上是关于XMLSerializer 异常“存在错误反映字段”和“对于非数组类型,您可以使用以下属性:XmlAttribute,..”的主要内容,如果未能解决你的问题,请参考以下文章

XmlSerializer(Type type, Type[] extraTypes) 内存泄漏

XmlSerializer - 必需的元素

保存文件 - xmlSerializer

XMLSerializer 不反序列化 XML

XmlSerializer '不支持编译 JScript/CSharp 脚本'

XmlSerializer:反序列化递归对象图