【发布时间】:2018-11-02 19:05:42
【问题描述】:
基于this 帖子,我尝试创建一个XmlTextWriter 的子类,它写入所有属性值,甚至是默认值。但我不能让它工作。有人可以帮忙吗?
这是我要序列化的类:
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlType(AnonymousType = true)]
[System.Xml.Serialization.XmlRoot(Namespace = "", IsNullable = false)]
public class Foo
{
public string content { get; set; }
[System.Xml.Serialization.XmlAttribute()]
[System.ComponentModel.DefaultValue(true)]
public bool isActive { get; set; }
}
这是我创建 Foo 实例并将其序列化为字符串的代码:
XmlSerializerNamespaces ns = new XmlSerializerNamespaces(
new XmlQualifiedName[] { new XmlQualifiedName("", "") });
// I need that for not writing a namespace during serialization
XmlSerializer serializer = new XmlSerializer(typeof(Foo));
Foo f = new Foo();
f.content = "hello";
f.isActive = false;
string fStr;
using (MemoryStream ms = new MemoryStream())
using (XmlWriter wr = new XmlTextWriter(ms, new UTF8Encoding(false)))
{
serializer.Serialize(wr, f, ns);
ms.Position = 0;
using (StreamReader sr = new StreamReader(ms))
{
fStr = sr.ReadToEnd();
}
}
此代码将为我提供fStr 的以下内容:
<?xml version="1.0" encoding="utf-8"?><Foo><content>hello</content></Foo>
但我也想明确写入默认值,即
<?xml version="1.0" encoding="utf-8"?><Foo isActive="true"><content>hello</content></Foo>
所以我创建了一个XmlTextWriter 的子类,并将上面的new XmlTextWriter(...) 替换为new DefaultValueXmlTextWriter(...)。这是我的DefaultValueXmlTextWriter 课程:
public class DefaultValueXmlTextWriter : XmlTextWriter
{
public DefaultValueXmlTextWriter(Stream s, Encoding e) : base(s, e) { }
public DefaultValueXmlTextWriter(string s, Encoding e) : base(s, e) { }
public DefaultValueXmlTextWriter(TextWriter t) : base(t) { }
public override void WriteAttributes(XmlReader reader, bool defattr)
{
base.WriteAttributes(reader, true);
}
}
base.WriteAttributes 的鼠标说:
在派生类中重写时,写出所有属性 在 XmlReader 中的当前位置找到。
所以我假设总是为defattr 选择true 可以解决问题,但它不会改变输出中的任何内容。我也试过false,也没用。
有什么想法吗?
【问题讨论】:
-
XmlSerializer决定序列化的内容,而不是XmlWriter。XmlWriter及其已弃用的子类XmlTextWriter不了解正在序列化的内容。他们将请求的任何内容写入 XML。为了强制XmlSerializer序列化默认值属性,我找到了Force XML serialization of XmlDefaultValue values 和How to tell XmlSerializer to serialize properties with[DefautValue(…)]always?。其中任何一个都充分回答了您的问题吗? -
而且,无论如何,
XmlWriter.WriteAttributes Method (XmlReader, Boolean)用于将属性从XmlReader复制到XmlWriter(例如,它在XmlWriter.WriteNode Method (XmlReader, Boolean)内部使用)所以它不会在序列化。
标签: c# xml-serialization xmlserializer