- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 HttpClient 将 xml 发布到休息服务。问题是服务需要命名空间前缀,而我无法使用 DataContractSerializer 实现。
预期的 xml:
<gto:createRequest xmlns:gto="http://www...com/sign">
<userId></userId>
<visibleDataContentType></visibleDataContentType>
<visibleData></visibleData>
<hiddenData></hiddenData>
<expiryInSeconds></expiryInSeconds>
</gto:createRequest>
我正在序列化的对象:
namespace ABC
{
[DataContract(Name = "createRequest", Namespace = "http://www...com/sign")]
public class CreateRequest
{
[DataMember(Name = "userId")]
public string UserId { get; set; }
[DataMember(Name = "visibleDataContentType")]
public string VisibleDataContentType { get; set; }
[DataMember(Name = "visibleData")]
public string VisibleData { get; set; }
[DataMember(Name = "hiddenData")]
public string HiddenData { get; set; }
[DataMember(Name = "expiryInSeconds")]
public int ExpiryInSeconds { get; set; }
}
}
我无法获取前缀“gto: createRequest”,这是 DataContractSerializer 输出的内容:
<createRequest xmlns="http://www...com/sign" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<expiryInSeconds></expiryInSeconds>
<hiddenData></hiddenData>
<userId></userId>
<visibleData></visibleData>
<visibleDataContentType></visibleDataContentType>
</createRequest>
我已经尝试过旧的 XmlSerializer,但没有成功。有什么想法吗!?
更新:命名空间前缀不必是 gto: 但 i 必须在那里!
更新:Ondrej Svejdars 的输出回答服务器不接受:
<gto:createRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:gto="http://www.test.com/sign">
<gto:expiryInSeconds>60</gto:expiryInSeconds>
<gto:hiddenData>hidden</gto:hiddenData>
<gto:userId>123456</gto:userId>
<gto:visibleData>visible</gto:visibleData>
<gto:visibleDataContentType>text/plain</gto:visibleDataContentType>
</gto:createRequest>
最佳答案
[编辑以匹配 gto:仅在顶部元素]
您可以调整 xml 编写器:
public class XmlProxyWritter : XmlTextWriter {
private string m_NS;
public XmlProxyWritter(string ns, TextWriter w)
: base(w) {
m_NS = ns;
}
public XmlProxyWritter(string ns, Stream w, Encoding encoding)
: base(w, encoding) {
m_NS = ns;
}
public XmlProxyWritter(string ns, string filename, Encoding encoding)
: base(filename, encoding) {
m_NS = ns;
}
public override string LookupPrefix(string ns) {
if (string.Compare(ns, m_NS, StringComparison.OrdinalIgnoreCase) == 0) {
return "gto";
}
return base.LookupPrefix(ns);
}
public override void WriteStartElement(string prefix, string localName, string ns) {
if (string.IsNullOrEmpty(prefix) && !string.IsNullOrEmpty(ns)) {
prefix = LookupPrefix(ns);
}
base.WriteStartElement(prefix, localName, ns);
}
}
商务舱:
[XmlRoot(ElementName = "createRequest", Namespace = "http://www.test.com/sign")]
public class CreateRequest {
[XmlElement(ElementName="userId", Namespace = "")]
public string UserId { get; set; }
[XmlElement(ElementName = "visibleDataContentType", Namespace = "")]
public string VisibleDataContentType { get; set; }
[XmlElement(ElementName = "visibleData", Namespace = "")]
public string VisibleData { get; set; }
[XmlElement(ElementName = "hiddenData", Namespace = "")]
public string HiddenData { get; set; }
[XmlElement(ElementName = "expiryInSeconds", Namespace = "")]
public int ExpiryInSeconds { get; set; }
}
调用示例(http://www.test.com/sign为CreateRequest的命名空间)
string result;
var serXml = new XmlSerializer(typeof(CreateRequest));
using (var stream = new MemoryStream()) {
using (var writer = new XmlProxyWritter("http://www.test.com/sign", stream, Encoding.UTF8)) {
serXml.Serialize(writer, new CreateRequest {
ExpiryInSeconds = 1,
HiddenData = "my preasures",
UserId = "Pepa"
});
}
result = Encoding.UTF8.GetString(stream.ToArray());
}
输出:
<?xml version="1.0" encoding="utf-8"?>
<gto:createRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:gto="http://www.test.com/sign">
<userId>Pepa</userId>
<hiddenData>my preasures</hiddenData>
<expiryInSeconds>1</expiryInSeconds>
</gto:createRequest>
这对你有用(我希望),但感觉有点像黑客攻击;也许这里正确的解决方案是“教”服务器正确的 xml 格式? :)
关于c# - DataContractSerializer - 命名空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20286205/
尝试返回一个时出现以下错误向客户提出问卷调查对象。我按照建议在数据协定中添加了 KnowType[typeof(...)],但它仍然不起作用。不知道序列化程序不知道哪种类型,我只是放入了 EF 模型中
我们有一个带有对象的应用程序,我们希望该对象在数据库中保持序列化。 当前,我们正在使用NetDataContractSerializer,但是最近发现,由于涉及到.Net类型信息,它创建了巨大的文件,
我正在阅读微软的 Best Practices: Data Contract Versioning ,他们说: Do not remove data members in later versions
我正在编写一个将由 Silverlight 应用程序使用的 WCF 应用程序。我已经完成了大部分的设计工作,我现在正在做实现,这让我想出了这个问题。 这是我的应用程序中存在的内容的示例: [DataC
我正在使用 DataContractSerializer 来存储我自己的类的对象以保存用户设置。 UserSettings 类使用其他一些不同数据类型的对象。我将所有这些类型添加到 DataContr
当我有以下类并尝试使用 DataContractSerializer 序列化 ConcreteClass 实例时.WriteObject(..) 我收到一个 InvalidDataContractEx
我有 50 个标有 DataContractAttribute 的类。 这些类形成了一个巨大的层次树,使用DataContractSerializer将其序列化/反序列化为xml。 除了我遗漏的 3
以下程序尝试从层次结构中序列化然后反序列化通用类型的对象,失败并出现代码下方列出的错误。 如何让它发挥作用? 代码: [DataContract] [KnownType(nameof(GetKnown
我遇到了一个关于数据协定序列化程序的非常愚蠢的问题。它拒绝工作。我只是想将一个对象序列化为一个 XmlDocument,但我似乎碰壁了。 以下是我希望序列化的数据契约(Contract): [Data
我在代码中序列化一个对象(不是通过 WCF 调用),并且我对已知类型有点着迷(我已经将它们与 WCF 一起使用,但没有将 DataContract 序列化程序作为“独立”序列化器) 当我运行下面的代码
我想使用 DataContractSerializer,但我对 WriteObject 方法中的 Stream 参数感到困惑 - 我知道我可以使用 MemoryStream 或 XmlWriter。我
这里有一些说明问题的测试代码: 编译配置: 公共(public)语言运行时支持:/clr C++ 语言 错误信息: 错误 4 错误 C2065:“DataContractSerializer”:未声明
我在反序列化 xml 文件中的列表时遇到问题。我的属性是内部的,所以我使用的是 datacontractserializer 而不是 xmlserializer。 我的xml如下
我注意到,如果我使用 Datacontractserializer 将对象持久化回文件中,如果新 xml 的长度比文件中最初存在的 xml 短,则原始 xml 的剩余部分会超过新 xml 的长度将保留
我正在使用 DataContractSerializer 将 xml 反序列化为列表。 xml结构如下: Attributes 类有 3 个通过属性引用的字符串数据成员,它们是: [Da
我正在从以 XML 形式返回 XML 的 restful 服务中提取数据 param1 value param2 value param1 value
我正在使用 HttpClient 将 xml 发布到休息服务。问题是服务需要命名空间前缀,而我无法使用 DataContractSerializer 实现。 预期的 xml:
我使用 DataContract 序列化程序来序列化我的数据。我使用 PreserveObjectReferences = true 因为我需要它。例如,我有两个对象: [Datacontract]
当使用 DataContractSerializer 反序列化 XML 时,我遇到了基类序列的问题。没有派生类从 XML 中反序列化:
最近,当我阅读 DataContractSerializer 的默认行为时,我得到了 rules来自 MSDN,但是我不明白我提取的第一条规则如下: The DataContractSerialize
我是一名优秀的程序员,十分优秀!