我正在尝试使用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()之前调用,则某些字节可能保留在内部作者缓冲区中。