0

シリアル化された 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);
    }
}
4

1 に答える 1

0

この修正は機能しているようです

    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();
        }
    }
于 2013-05-23T07:02:49.927 に答える