2015-08-09 58 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