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 格式?为什么不这样做:<Filter computerid="123456" computername="mycomputer" computermodel="mymodel" />
.
@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) 内存泄漏