datacontractserializer带有内存丢失字节



我正在尝试使用wcf datacontractserializer将数据合同对象序列化为存储器。

然后我使用MemoryStream.ToArray获取序列化内容。

最后,我使用Arther FileStream将存储器坚持到文件中。

我的最初实现就是这样。我在持久文件末尾缺少字节。

    public virtual string SerializeTransient(DataObject data, string targetPath)
    {
        string securityCode;
        using (var memoryStream = new MemoryStream())
        {
            using (var xmlWriter = XmlWriter.Create(memoryStream, new XmlWriterSettings {Indent = true}))
            {
                _serializer.WriteObject(xmlWriter, data);
                using (var fileStream = new FileStream(targetPath, FileMode.Create))
                {
                    securityCode = CalculateSecurityCode(memoryStream.ToArray());
                    memoryStream.WriteTo(fileStream);
                }
            }
        }
        return securityCode;
    }

如果我使用{}块(见下文)将持久逻辑移出内部,则输出是正确的。几乎感觉WriteObject函数还没有完成它在做什么。有人可以向我解释那里发生了什么吗?谢谢。

    public virtual string SerializeTransient(DataObject data, string targetPath)
    {
        string securityCode;
        using (var memoryStream = new MemoryStream())
        {
            using (var xmlWriter = XmlWriter.Create(memoryStream, new XmlWriterSettings {Indent = true}))
            {
                _serializer.WriteObject(xmlWriter, data);
            }
            using (var fileStream = new FileStream(targetPath, FileMode.Create))
            {
                securityCode = CalculateSecurityCode(memoryStream.ToArray());
                memoryStream.WriteTo(fileStream);
            }
        }
        return securityCode;
    }

xmlWriter具有内部缓冲区。您应关闭/处置XMLWriter或致电XMLWRITER.FLUSH()以强制所有内容写入基础流(MemoryStream)。

如果MemoryStream.toArray()在writer.flush()之前调用,则某些字节可能保留在内部作者缓冲区中。

相关内容

  • 没有找到相关文章