带有MemoryStream的DataContractSerializer缺少字节

时间:2014-01-23 07:31:12

标签: c# wcf stream

我正在尝试使用WCF DataContractSerializer将DataContract对象序列化为memoryStream。

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

最后,我使用anther fileStream将memoryStream保存到文件中。

我的初始工具是这样的。我在保留文件的末尾丢失了字节。

    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;
    }

1 个答案:

答案 0 :(得分:2)

XmlWriter有一个内部缓冲区。您应该关闭/处置XmlWriter或调用XmlWriter.Flush()以强制将所有内容写入基础流(memoryStream)。

如果在writer.Flush()之前调用了memoryStream.ToArray(),那么一些字节可能会保留在内部写入器缓冲区中。