如何在派生自 XmlObjectSerializer 的 class 中设置 XmlWriterSettings 的缩进?

How to set the indent of XmlWriterSettings in a class, derived from XmlObjectSerializer?

我正在扩展 XmlObjectSerializer 并且我想配置它的缩进,但它在 XmlWriterSettings 成员中并且是只读的。从文档中我可以看到它只能在创建 XmlWriter 实例时设置,例如:

XmlWriter writer = XmlWriter.Create(stringWriter, settings);

但我没有创建一个。我创建我的 class XmlObjectWithRefSerializer,派生自 XmlObjectSerializer,像这样:

StreamWriter swWriter = File.CreateText(sFilename);
var serializer = new XmlObjectWithRefSerializer(tType);
serializer.WriteObject(swWriter.BaseStream, oData);
swWriter.Close();

在我的 class 中,它在我必须覆盖的方法中用作 XmlDictionaryWriter,例如:

public override void WriteObjectContent(XmlDictionaryWriter writer, object graph)
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    settings.Indent = true;
    //writer.Settings = settings;  --> Fails because read only
    ...
}

那么,有没有办法为我的派生 class 提供设置?

总之,我觉得你做不到。

摘要XmlWriterclass上的Settings属性(类型XmlWriterSettings)被定义为虚拟的,因此可以在子class是的,但是这对您的情况没有帮助。

您正在调用 WriteObject 方法,传递要写入的流。接下来发生的是,在 XmlObjectSerializer class 中,该方法将创建一个新的 XmlDictionaryWriter(它只是提供流的包装器),然后将其传递给您覆盖(WriteObjectContent 等)。

似乎在任何时候都没有可用于将编写器设置替换为您自己的设置的挂钩。