2015-08-09 55 views
2

我使用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:我和xmlns:一,并设定了Indent = true;,我该怎么办呢?

+0

你有一个新的问题又在那里。这和上一个类是一样的吗? –

+0

是的。为什么? – David

回答

4

首先,你需要用[DataContract(Namespace = "http://schemas.datacontract.org/2004/07/WcfWebService")]来标记你所有的类来声明每个类应该在该名字空间中被序列化。完成此操作后,您必须标记每个或要与[DataMember]进行序列化的属性,因为DataContractSerializer已选择加入。

因此:

[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允许更多控制。)它是无害的,但您可以按照Avoiding using the “http://www.w3.org/2001/XMLSchema-instance” namespace with .Net DataContractSerializer中的说明手动将其删除。

1
[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> 
+0

任何想法如何完全删除命名空间? – leen3o