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

Смежные вопросы