簡體   English   中英

.Net DataContractSerializer的往返XML序列化失敗

[英]Round trip XML serializing with .Net DataContractSerializer fails

我的序列化XML字符串的開頭似乎有些破爛。 我有一個簡單的擴展方法

    public static string ToXML(this object This)
    {
        DataContractSerializer ser = new DataContractSerializer(This.GetType());


        var settings = new XmlWriterSettings { Indent = true };

        using (MemoryStream ms = new MemoryStream())
        using (var w = XmlWriter.Create(ms, settings))
        {
            ser.WriteObject(w, This);
            w.Flush();
            return UTF8Encoding.Default.GetString(ms.ToArray());
        }
    }

當我將其應用於對象時,我得到了字符串

<?xml version="1.0" encoding="utf-8"?>
<RootModelType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WeinCad.Data">
  <MoineauPump xmlns:d2p1="http://schemas.datacontract.org/2004/07/Weingartner.Numerics">
    <d2p1:Rotor>
      <d2p1:Equidistance>0.0025</d2p1:Equidistance>
      <d2p1:Lobes>2</d2p1:Lobes>
      <d2p1:MajorRadius>0.04</d2p1:MajorRadius>
      <d2p1:MinorRadius>0.03</d2p1:MinorRadius>
    </d2p1:Rotor>
  </MoineauPump>
</RootModelType>

請注意開頭的垃圾。 當我嘗試反序列化時,出現錯誤。 如果我將XML粘貼到源代碼中(減去垃圾字首),則可以反序列化。 什么是垃圾文字,如何刪除或處理?

注意我的反序列化代碼是

public static RootModelType Load(Stream data)
{
    DataContractSerializer ser = new DataContractSerializer(typeof(RootModelType));
    return (RootModelType)ser.ReadObject(data);
}

public static RootModelType Load(string data)
{
    using(var stream = new MemoryStream(Encoding.UTF8.GetBytes(data))){
        return Load(stream);
    }
}

此修復程序似乎有效

    public static string ToXML(this object obj)
    {
        var settings = new XmlWriterSettings { Indent = true };

        using (MemoryStream memoryStream = new MemoryStream())
        using (StreamReader reader = new StreamReader(memoryStream))
        using(XmlWriter writer = XmlWriter.Create(memoryStream, settings))
        {
            DataContractSerializer serializer = 
              new DataContractSerializer(obj.GetType());
            serializer.WriteObject(writer, obj);
            writer.Flush();
            memoryStream.Position = 0;
            return reader.ReadToEnd();
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM