[英]Removing namespaces serializing with DataContractSerializer
我使用DataContractSerializer
来序列化对象。 这是我的代码:
private string XmlSerial<T>(T instance)
{
DataContractSerializer Serializer = new DataContractSerializer(typeof(T));
using (MemoryStream memoryStream = new MemoryStream())
{
Serializer.WriteObject(memoryStream, instance);
return Encoding.Default.GetString(memoryStream.ToArray());
}
}
这是我的输出:
<WS_IN_GetAccountCredit xmlns="http://schemas.datacontract.org/2004/07/WcfWebService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<GetAccountCreditParams xmlns:a="http://schemas.datacontract.org/2004/07/RestConsumer">
<a:Password>String content</a:Password>
<a:UserName>String content</a:UserName>
</GetAccountCreditParams>
<WSIdentity xmlns:a="http://schemas.datacontract.org/2004/07/RestConsumer">
<a:WS_PassWord>String content</a:WS_PassWord>
<a:WS_UserName>String content</a:WS_UserName>
</WSIdentity>
</WS_IN_GetAccountCredit>
我现在需要删除xmlns:i和xmlns:a并设置Indent = true;
, 我该怎么做?
首先,您需要使用[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")]
标记所有类,以声明每个类都应在该命名空间中序列化。 完成此操作后,由于还选择加入DataContractSerializer
,因此还必须使用[DataMember]
标记每个要序列化的属性。
从而:
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")]
public class WS_IN_GetAccountCredit
{
[DataMember]
public GetAccountCreditParams GetAccountCreditParams { get; set; }
[DataMember]
public WSIdentity WSIdentity { get; set; }
}
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")]
public class GetAccountCreditParams
{
[DataMember]
public string Password { get; set; }
[DataMember]
public string UserName { get; set; }
}
[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")]
public class WSIdentity
{
[DataMember]
public string WS_PassWord { get; set; }
[DataMember]
public string WS_UserName { get; set; }
}
其次,进行缩进,你可以创建一个XmlWriterSettings
与期望的压痕,然后创建一个XmlWriter
从它和使用它的系列化,如下面的扩展方法:
public static class DataContractSerializerHelper
{
public static string GetXml<T>(T obj, DataContractSerializer serializer)
{
using (var textWriter = new StringWriter())
{
var settings = new XmlWriterSettings { Indent = true, IndentChars = " " };
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
{
serializer.WriteObject(xmlWriter, obj);
}
return textWriter.ToString();
}
}
public static string GetXml<T>(T obj)
{
var serializer = new DataContractSerializer(typeof(T));
return GetXml(obj, serializer);
}
}
第三,关于删除标准名称空间xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
我不认为可能直接与DataContractSerializer
。 ( XmlSerializer
可以进行更多控制。)它无害,但是您可以按照避免将.http://www.w3.org/2001/XMLSchema-instance命名空间与.Net DataContractSerializer一起使用中的说明进行手动删除。
[DataContract(Namespace = "")]
在每堂课的顶部,它变得更好了。 它删除了datacontract命名空间和丑陋的节点前缀。 但是,将保留标准名称空间。 我的情况还可以。
之前:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.datacontract.org/2004/07/MyClassname">
<prop1>true</prop1>
<prop2 xmlns:d2p1="http://schemas.datacontract.org/2004/07/MySubclassname">
<d2p1:sub>true</d2p1:sub>
</prop2>
</root>
后:
<?xml version="1.0" encoding="utf-8"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<prop1>true</prop1>
<prop2>
<sub>true</sub>
</prop2>
</root>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.