- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
由于 xsi:type="p:OUTPUT-HEADER"属性,我很难尝试反序列化对应于 WCF SOAP 服务故障详细信息部分的这段 XML 代码:
<p:OUTPUT-HEADER xsi:type="p:OUTPUT-HEADER" xmlns:p="http://aaa.bbb.ccc/v2" xmlns:ns0="http://aaa.bbb.ccc/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FAULT>
<p:COD-ERROR>2951</p:COD-ERROR>
<p:COD-SEV>8</p:COD-SEV>
<p:MSG-ERROR>Error message</p:MSG-ERROR>
</FAULT>
<CNL-OUT>xxx</CNL-OUT>
</p:OUTPUT-HEADER>
这些是我正在使用的类:
[XmlInclude(typeof(OutputHeader))]
public abstract class FaultDetail
{
[XmlElement(ElementName = "FAULT", Namespace = "")]
public Fault FaultSection{ get; set; }
[XmlElement(ElementName = "CNL-OUT", Namespace = "")]
public string ClnOut{ get; set; }
}
[XmlRoot(ElementName = "OUTPUT-HEADER", Namespace = "http://aaa.bbb.ccc/v2")]
public class OutputHeader : FaultDetail
{
}
public class Fault
{
[XmlElement(ElementName = "COD-ERROR")]
public int CodigoError { get; set; }
[XmlElement(ElementName = "COD-SEV")]
public int Severidad { get; set; }
[XmlElement(ElementName = "MSG-ERROR")]
public string Mensaje { get; set; }
}
XmlSerializer:
XmlSerializer x = new XmlSerializer(typeof(OutputHeader));
调用反序列化方法时出现的错误:
“无法识别指定的类型:名称='OUTPUT-HEADER',命名空间='http://aaa.bbb.ccc/v2 ', 在
是否可以修饰类以正确反序列化此 XML?非常感谢任何想法,谢谢!
最佳答案
而不是 XmlSerializer
,您似乎必须使用 DataContractSerializer
反序列化此 XML。这个序列化器是 default serializer for WCF因此您只需要删除指定使用 XmlSerializer
的代码。
按如下方式设计您的类型:
[DataContract(Namespace = "")]
public abstract class OutputHeaderBase
{
[DataMember(Name = "FAULT", Order = 1)]
public Fault FaultSection { get; set; }
[DataMember(Name = "CNL-OUT", Order = 2)]
public string ClnOut { get; set; }
}
[DataContract(Name = "OUTPUT-HEADER", Namespace = "http://aaa.bbb.ccc/v2")]
public class OutputHeader : OutputHeaderBase
{
}
[DataContract(Name = "FAULT", Namespace = "http://aaa.bbb.ccc/v2")]
public class Fault
{
[DataMember(Name = "COD-ERROR", Order = 1)]
public int CodigoError { get; set; }
[DataMember(Name = "COD-SEV", Order = 2)]
public int Severidad { get; set; }
[DataMember(Name = "MSG-ERROR", Order = 3)]
public string Mensaje { get; set; }
}
然后将您的操作合约声明为返回(或接受)OutputHeader
类型的对象(不是OutputHeaderBase
)。
最后通过删除 [XmlSerializerFormat]
切换回数据契约(Contract)序列化从您的服务和/或运营契约(Contract)中,您应该准备就绪。有关切换的详细信息,请参阅 Using the XmlSerializer Class
(另请注意,Fault
的属性需要放入正确的命名空间中。)
为什么这样行得通?
"xsi:type"
attribute 是一个 w3c 标准属性,允许元素显式断言其类型。两者 XmlSerializer
和 DataContractSerializer
在序列化多态类型时使用此属性来传达实际类型信息。但是,以下元素:
<p:OUTPUT-HEADER
xsi:type="p:OUTPUT-HEADER"
xmlns:p="http://aaa.bbb.ccc/v2"
xmlns:ns0="http://aaa.bbb.ccc/v2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
</p:OUTPUT-HEADER>
在命名空间 http://aaa.bbb.ccc/v2
中有基本类型 OUTPUT-HEADER
和命名空间中的子类型 OUTPUT-HEADER
http://aaa.bbb.ccc/v2
-- 即类型和子类型信息相同,因此 xsi:type
属性是多余的。
但是,如果它是多余的,它应该是无害的,对吧?您可以为 XmlSerializer
设计一个类型层次结构,如下所示:
[XmlRoot(ElementName = "OUTPUT-HEADER", Namespace = "http://aaa.bbb.ccc/v2")]
[XmlInclude(typeof(OutputHeaderSubclass))] // Artificial subtype to trigger handling of the `xsi:type` attribute.
[XmlInclude(typeof(OutputHeader))]
public class OutputHeader
{
[XmlElement(ElementName = "FAULT", Namespace = "")]
public Fault FaultSection { get; set; }
[XmlElement(ElementName = "CNL-OUT", Namespace = "")]
public string ClnOut { get; set; }
}
[XmlRoot(ElementName = "OUTPUT-HEADER-SUBCLASS", Namespace = "http://aaa.bbb.ccc/v2")]
public class OutputHeaderSubclass : OutputHeader
{
}
然后反序列化为 OutputHeader
可能会很好地工作。不幸的是,事实并非如此。 XmlSerializer
为冗余属性抛出异常而不是处理它。相反,DataContractSerializer
没有,所以要使用它。
关于c# - XmlSerializer 和 xsi : deserialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42814684/
我的应用使用 Jackson。我得到的最小化构建主要使用此配置: # don't obfuscate Jackson classes -keep class com.fasterxml.** { *;
编辑:在我问这个问题的那一刻,我想到了尝试一些事情..我已经根据请求设置了 XmlNamespace 属性,这就成功了.. request.XmlNamespace = "http://musicbr
我使用可序列化和可反序列化的泛型。但是,Deserialize上有错误派生属性告诉无法推断类型。 struct 和 enum 都会抛出编译错误。评论其中之一不会解决任何问题。 use serde::{
passport.socketio 抛出此错误,同时无法授权用户。 Error: Error: Failed to deserialize user out of session 我已将问题范围缩小到
我正在尝试在具有借用内容的结构上派生反序列化: #[macro_use] extern crate serde_derive; use std::net::SocketAddr; #[derive(H
我执行查询以创建下面的Hive表: CREATE TABLE db1.test_create_tbl( column1 smallint COMMENT 'desc of column') COMME
这个问题在这里已经有了答案: Can System.Text.Json.JsonSerializer serialize collections on a read-only property? (
我正在使用 event_emmiter_rs用于我的应用程序中的事件处理。该库允许您订阅带有回调的事件并触发这些事件。事件采用 (strings, value) 的形式,回调采用接受值参数的闭包形式。
我收到一个错误...(不存在像默认构造函数这样的创建者):无法从对象值反序列化(没有基于委托(delegate)或基于属性的创建者),这表明我需要一个属性基于的创作者。我有几个具有不同参数但没有默认值
我相信我们需要一个自定义的反序列化器来对我们类的一个字段做一些特定的事情。看来一旦我这样做了,我现在负责反序列化所有其他领域。有没有办法让 jackson 反序列化除了我在这里关心的领域之外的所有领域
我有一个如下所示的类(class) class Person { Long id; String firstName; int age; } 我的输入看起来像这样: { "id
文档建议 NancyFx 帮助我解决 json 请求正文的 WRT 反序列化,但我不确定如何。请参阅下面的测试以演示: [TestFixture] public class ScratchNancy
考虑代码... using System; using System.Text.Json; public class Program { public static void Main()
有人让Deserializer工作吗?我正在方法“反序列化”而不是元素中获得完整的JSON表达式? public static void main(String[] args) { G
在尝试从 tokio TcpStream 反序列化为 JSON Value 时,我正在尝试使用此函数: use futures::prelude::*; use serde_json::Value;
我使用 Spring Boot 和 thymeleaf我尝试保存对象列表。 我的对象。 public class GECPD { public Integer id; public S
我正在尝试制作在线领唱。我需要从外部API获取包含货币值的表,正是从该页面:http://api.nbp.pl/api/exchangerates/tables/A?format=json我想在货币课
错误: java.lang.ClassNotFoundException: testprocedure.tp$3 at java.net.URLClassLoader$1.run(Unknown So
我开发了多个 GWT Web 应用程序。最新的一个是对另一个的稍微修改。除了最新的之外,所有这些都运行良好。异常(exception)是: The response could not be dese
我需要反序列化 1.5GB txt 文件。我正在使用 code.google.com/p/protobuf-net/中的 protobuf-net 有时它会因不同地方的不同异常(空引用、内存访问冲突)
我是一名优秀的程序员,十分优秀!