在处理.NET Portable时,XmlDictionaryWriter会关闭输出流

时间:2016-05-19 13:27:20

标签: c# .net serialization xml-serialization

我的上下文是.NET PCL Profile111。

我尝试将DataContractSerializerXmlDictionaryWriter一起用于二进制xml序列化。我遇到的问题是,在我处理XmlDictionaryWriter MemoryStream后,它正在编写以便关闭。 我的代码:

using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(outputStream))
{
    DataContractSerializer serializer = new DataContractSerializer(iObject.GetType());
    serializer.WriteObject(writer, iObject);
    writer.Flush();
}

//outputStream is closed now.

XmlWriterSettings的文档默认情况下CloseOutput属性为 false

我无法将XmlDictionaryWriter.CreateBinaryWriter的重载用于ownsStream参数,因为它在PCL中不可用。

如何在XmlDictionaryWriter被处置后让Stream让输出XmlDictionaryWriter生效?

2 个答案:

答案 0 :(得分:2)

鉴于您的PCL版本上的重载XmlDictionaryWriter.CreateBinaryWriter(outputStream, null, null, false)不可用,您有两个类似于Is there any way to close a StreamWriter without closing its BaseStream?中描述的选项:

  1. 您可以刷新但不处理XmlDictionaryWriter并将其留给GC进行清理。与Dispose()方法不同,终结方法处理基础流。

  2. 为您的流创建一个包装器Stream,在处理时,不会释放基础流。例如。 Jon Skeet在MiscUtil

  3. NonClosingStreamWrapper

答案 1 :(得分:0)

我认为唯一的选择是自己实现XmlDictionaryWriter类。

这可能看起来很难,但你所要做的就是创建2个新类: PersistentXmlDictionaryWriterthis one完全相同,但不是派生自XmlWriter,而是来自您的新课程PersisternXmlWriter,这将类似于this one,但您会改变处理方法不要关闭流。

应该这样做。