我正在尝试使用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;
}
答案 0 :(得分:2)
XmlWriter有一个内部缓冲区。您应该关闭/处置XmlWriter或调用XmlWriter.Flush()以强制将所有内容写入基础流(memoryStream)。
如果在writer.Flush()之前调用了memoryStream.ToArray(),那么一些字节可能会保留在内部写入器缓冲区中。