我试图反序列化以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<jobInfo
xmlns="http://www.force.com/2009/06/asyncapi/dataload">
<id>asjdkfljasl;kdf</id>
<operation>query</operation>
<object>jsdkfjsakldjakl</object>
...
</jobInfo>
我有以下代码,可以发出POST请求并成功运行,但无法反序列化到我的类中。
client.DefaultRequestHeaders.Add("X-SFDC-Session", binding.SessionHeaderValue.sessionId);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", binding.SessionHeaderValue.sessionId);
var content = new StringContent(createJobXml, Encoding.UTF8, "application/xml");
content.Headers.ContentType = new MediaTypeHeaderValue("application/xml");
HttpResponseMessage response = await client.PostAsync(
$"https://{SERVER_INSTANCE}.salesforce.com/services/async/43.0/job", content
);
response.EnsureSuccessStatusCode();
jobInfo job = await response.Content.ReadAsAsync<jobInfo >(new List<MediaTypeFormatter>() {
new XmlMediaTypeFormatter { UseXmlSerializer = true },
new JsonMediaTypeFormatter()
});
但是我得到了错误
没有MediaTypeFor事可用于从具有媒体类型应用程序/xml的内容中读取类型为jobInfo的对象,
我的作业信息是使用xsd生成的。exe文件。xml
,xsd。exe文件。xsd/类
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.81.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://www.force.com/2009/06/asyncapi/dataload")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://www.force.com/2009/06/asyncapi/dataload", IsNullable = false)]
public partial class jobInfo
{
private string idField;
private string operationField;
private string objectField;
...
public string id
{
get {
return this.idField;
}
set {
this.idField = value;
}
}
public string operation
{
get {
return this.operationField;
}
set {
this.operationField = value;
}
}
...
}
为了正确地反序列化,我错过了什么?
这意味着我应该把它当作一个字符串来读:
如何使用HttpClient读取XML响应?
但这表明它应该“起作用”
HttpClient ReadAsAsync
我也尝试过(在我使用xsd将xml转换为类之前,我使用的是类Bulkv1Jobs)
[DataContract]
public class Bulkv1Job
{
[DataMember]
string id { get; set; }
[DataMember]
string operation { get; set; }
[DataMember]
string @object { get; set; }
...
}
和
[XmlRoot("jobInfo")]
public class Bulkv1Job
{
[XmlElement("id")]
string id { get; set; }
[XmlElement("operation")]
string operation { get; set; }
...
}
嗯,我不是soap方面的专家,但如果我记得清楚的话,它应该在属性上有[DataMember]这样的修饰符,在类上有[DataContract(NameSpace=“jobInfo”)]这样的修饰符。您可以看到,在第一个建议中,您向guy提供了使用[XmlRoot]和[XmlElement]
您还可以看到WCF Dataconact,一些字段不反序列化,也许它会帮助你
经过测试,与
var s = await response.content.readasstringasync();
var buffer = encoding.utf8.getbytes(s);
using (var stream = new memorystream(buffer)) {
var serializer = new xmlserializer(typeof(jobinfo)); // FAILED LINE
var jobinfo = (jobinfo)serializer.deserialize(stream);
//then do whatever you want
return jobinfo;
}
我发现由于类保护错误,串行化程序在上一行失败了。确保jobInfo
类是公共的和可访问的,错误就消失了,反序列化(stream)工作了。
删除该代码并使用readAsAsync
谢谢@Ryan
问题内容: log4j网络适配器将事件作为序列化的Java对象发送。我希望能够捕获此对象并以另一种语言(python)将其反序列化。这可能吗? 注意 网络捕获很容易;它只是一个TCP套接字并在流中读取。困难是反序列化部分 问题答案: 通常,不会。 本文档中定义了Java序列化的流格式,但是您需要访问原始类定义(以及将它们加载到Java运行时中)以将流数据转换回接近原始对象的内容。例如,类可以定义w
问题内容: 我正在尝试反序列化使用.NET 4.0任务模式返回的JSON 。它将返回此JSON(“加载JSON数据” @ )。 索引动作: 职位和职位类别: 当我设置断点并检查状态为“故障”时。InnerException是“ Type ProjectName.Jobs不是集合”。 我从没有JsonArray属性的Jobs类型开始,而Jobs作为数组(Job [])开始出现此错误。 如何使用.NE
问题内容: 我将一个序列化为一个文件,并将该文件传输到另一台计算机上的另一个系统。 而且由于接收文件的系统是不同的,所以我没有相同的类,而是具有完全相同的结构但使用不同的包的类。 当我使用 从文件中读出我有一个。 如何避免这种异常?是否仅在接收列表时需要在其他系统中创建相同的包结构? 问题答案: 是的,您可以做三件事之一。 用相同的包名称创建相同的类 创建一个接口(当然,在两台计算机上都使用相同的
现在我和杰克逊一起工作,我有一些问题。 首先。我有两个服务,第一个是数据收集和发送服务,第二个是接收这些数据,例如,将其记录到文件中。 因此,第一个服务具有如下类层次结构: 第二个服务具有如下类层次结构: 第一个服务对无所知。 我在第一个服务上发送数据的方式: 所以,我想将json拟人化为的Collection,而不是的Collection(
问题内容: 我是C ++的新手。使用序列化和反序列化类型数据的最简单方法是什么。我发现了一些使用示例,但它们对我来说是晦涩的。 问题答案: 请注意,将键解释为路径,例如,将对“ ab” =“ z”放置将创建{“ a”:{“ b”:“ z”}} JSON,而不是{“ ab”:“ z”} 。否则,使用是微不足道的。这是一个小例子。
我需要一个自定义反序列化器来在复杂的POJO中转换字符串。反序列化工作直到使用反序列化器:特别是使用自定义反序列化器时,我的对象的非对象属性不会序列化。 我有一个restful Web服务,它有一个pojo作为参数。 所以我的类PreentivoWs需要一个方法。这里是类定义: 在jsonObject中,我有一个枚举定义为 但此对象需要转换反序列化程序: 并在财产上标注: fromString方法