从xml反序列化对象会出错:'内存流不可扩展'

Mic*_*hel 2 c# serialization

我重新使用了一些旧的代码(我认为是旧的.net版本),用于从xml反序列化一个对象(最后我将粘贴我用于序列化对象的代码)

这是代码:

/// <summary>
        /// Reconstruct an object from an XML string
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static T DeserializeObject<T>(string xml)
        {
            using (MemoryStream stream = new MemoryStream(StringToUTF8ByteArray(xml)))
            using (new XmlTextWriter(stream, Encoding.UTF8))
            {
                return (T)new XmlSerializer(typeof(T)).Deserialize(stream);
            }
        }
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误:'Memory stream is not expandable'在返回线.

什么地方出了错?

这是序列化代码:

MemoryStream stream = new MemoryStream();
            using (XmlTextWriter xml = new XmlTextWriter(stream, Encoding.UTF8))
            {
                XmlSerializer xs = new XmlSerializer(item.GetType());
                xs.Serialize(xml, item);
                stream = (MemoryStream)xml.BaseStream;
            }

            return UTF8ByteArrayToString(stream.ToArray());
Run Code Online (Sandbox Code Playgroud)

编辑

这是缺失的功能

private static Byte[] StringToUTF8ByteArray(string pXmlString)
        {
            UTF8Encoding encoding = new UTF8Encoding();
            byte[] byteArray = encoding.GetBytes(pXmlString);
            return byteArray;
        }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

首先,你要创建一个MemoryStream阅读从XML.然后你创建一个XmlTextWriter该流.为什么?

我怀疑你可以摆脱第二个使用声明:

using (MemoryStream stream = new MemoryStream(StringToUTF8ByteArray(xml)))
{
    return (T)new XmlSerializer(typeof(T)).Deserialize(stream);
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,你的StringToUTF8ByteArray方法做什么并不清楚- 它只是:

return Encoding.UTF8.GetBytes(text);
Run Code Online (Sandbox Code Playgroud)

?如果是这样,那可能不是正确的做法 - 如果原始XML是在其他编码中,那么XML声明会说一件事,而流将包含用另一种编码编码的文本......不好.你可能会更好:

using (TextReader reader = new StringReader(xml))
{
    return (T)new XmlSerializer(typeof(T)).Deserialize(XmlReader.Create(reader));
}
Run Code Online (Sandbox Code Playgroud)