在內部,根據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