在内部,根据docs,状态服务器使用BinaryFormatter
来序列化复杂类型。 BinaryFormatter
序列化标记为[Serializable]
的类或结构的所有公共和专用字段(非属性!)。但是,如您所指出的,XmlDocument
没有如此标记,因此不能立即使用BinaryFormatter
进行序列化。
XmlDocument
然而,可以从字符串中轻松地转换为字符串 - 文档所代表的XML本身。因此,如果XmlDocument
字段包含在实现ISerializable
的类型中,那么其GetObjectData()
可以简单地将相应的XML字符串存储在序列化流内。然后相应的序列化构造函数可以提取XML字符串并重构XmlDocument
。
由于在预先存在的类实现ISerializable
可能很耗时,最简单的方式来完成你想要什么就为大家介绍一个小的序列化包装结构的XML文档:
[Serializable]
public struct XmlDocumentSerializationWrapper : ISerializable
{
public static implicit operator XmlDocumentSerializationWrapper(XmlDocument data) { return new XmlDocumentSerializationWrapper(data); }
public static implicit operator XmlDocument(XmlDocumentSerializationWrapper wrapper) { return wrapper.XmlDocument; }
private readonly XmlDocument xmlDocument;
public XmlDocument XmlDocument { get { return xmlDocument; } }
public XmlDocumentSerializationWrapper(XmlDocument xmlDocument)
{
this.xmlDocument = xmlDocument;
}
public XmlDocumentSerializationWrapper(SerializationInfo info, StreamingContext context)
{
var xml = (string)info.GetValue("XmlDocument", typeof(string));
if (!string.IsNullOrEmpty(xml))
{
xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
}
else
{
xmlDocument = null;
}
}
#region ISerializable Members
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
if (XmlDocument != null)
{
var xml = XmlDocument.OuterXml;
info.AddValue("XmlDocument", xml);
}
else
{
info.AddValue("XmlDocument", (string)null);
}
}
#endregion
}
然后,在要序列化类,与包装结构领域,如更换您的XmlDocument
字段(和自动实现的属性):
[Serializable]
public class TestClass
{
XmlDocumentSerializationWrapper doc;
public XmlDocument Document { get { return doc; } set { doc = value; } }
}
在struct手柄自动转换f显示隐含的运营商ROM和包装。
来源
2015-09-15 10:05:02
dbc
坦克很多。它适用于XmlDocument,那么XslCompiledTransform呢?我如何序列化这个类? – Hadi
@哈迪 - 我对那个班不熟悉。如果您可以找出一种方法将XML样式表作为字符串(或XmlDocument)从类中提取出来,则可以使用相同的技术。这里问题的首选格式是[每个问题一个问题](http://meta.stackexchange.com/questions/222735/can-i-ask-only-one-question-per-post),所以我建议问一个问题第二个问题。 – dbc