【问题标题】:XmlDictionaryWriter closes the output stream when disposed, .NET PortableXmlDictionaryWriter 在处理时关闭输出流,.NET Portable
【发布时间】:2016-05-19 13:27:19
【问题描述】:

我的上下文是 .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 中不可用。

我怎样才能让XmlDictionaryWriterXmlDictionaryWriter 被处理后让输出Stream 生效?

【问题讨论】:

  • 不知道如何实现这一点,但您误会了一件事。 CloseOutput 属性是调用Close 方法时的行为设置。不是Dispose。可能需要关闭Stream 在此类中正确实现IDisposable。如果我是作者,我会这样做。另外,你为什么要这样做?也许有另一种方法可以达到您想要的效果。
  • @Peuczyński 我查看了XmlDictionaryWriter.Dispose 源代码,它继承自XmlWriter,只是在里面调用了Close 方法。
  • 我就是这么想的。你还没有告诉你要达到什么目标。
  • @dbc Wrapper for the MemoryStream ... 可以工作。将此作为答案发布。谢谢。

标签: c# .net serialization xml-serialization


【解决方案1】:

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

  1. 您可以刷新但不能丢弃 XmlDictionaryWriter,并将其留给 GC 进行清理。与Dispose() 方法不同,终结方法不会释放底层流。

  2. 为您的流创建一个包装器Stream,该包装器在处置时不会处置基础流。例如。 Jon Skeet 在他的MiscUtil 中有NonClosingStreamWrapper

【讨论】:

    【解决方案2】:

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

    这似乎很难,但您所要做的就是创建 2 个新类: PersistentXmlDictionaryWriterthis one 完全相同,但不是从 XmlWriter 派生,而是从您的新类 PersisternXmlWriter 派生,这将与 this one 非常相似,但您将更改 Dispose 方法以不关闭流。

    应该可以的。

    【讨论】:

    • 这样我就可以摆脱对 .NET BinaryXmlWriter 的更新。这在序列化的问题上太危险了。
    • 我没有看到任何其他方法可以做到这一点。如果您尝试做与标准方法不同的事情,则必须创建自己的类。我没有看到任何其他可能的解决方案,我们都看到了源代码。
    • 这不是非标准的东西。实际上,XmlDictionaryWriter.CreateBinaryWriter 有一个带有显式标志的重载,即 ownsStream 可以满足我的需要,但它不适用于 PCL。
    • 当我说非标准时,我的意思是你试图改变一个类的自然行为。这就像说教猫叫不是不标准的,因为另一种四足动物有能力。我希望这次我清楚了。基本上,如果您尝试更改某个类的一些内部代码,则没有其他方法。我尝试创建派生自Stream 的类,然后将其提供给XmlDictionaryWriter,但后来我遇到了没有接受Stream 作为参数的构造函数的问题,创建它基本上是编写新类.
    • 同样,XmlDictionaryWriter.CreateBinaryWriter 旨在将流视为外部资产。这是它的自然行为。教猫叫是非常不同的事情。
    猜你喜欢
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    相关资源
    最近更新 更多