[英]Error on XML serializing on a non-serializable object on a non-serialized method
我正在使用此代碼
XmlSerializer xs = new XmlSerializer(typeof(T));
序列化對象。
現在,我在這行代碼中遇到錯誤(它是在要序列化的對象中向下嵌套的對象中)
public override List<BrokenRule> GetBrokenRules() {
錯誤是Csla.Validation.BrokenRule無法序列化,因為它沒有無參數構造函數。
現在是正確的,但是我認為methods
沒有序列化,所以出了什么問題( Csla.Validation.BrokenRule
在其他地方未使用)
如果是設計使然,那么是否有一種方法可以讓運行時說“忽略對象的這一部分”?
不允許使用屬性等編輯對象代碼。
可以將該類序列化為XML的一種方法是為派生類創建XmlSerializer
,並傳遞XmlAttributeOverrides
,這些XmlAttributeOverrides
指定返回類的屬性為XmlIgnore
。 但是,按照文檔中的指定,您必須緩存並重新使用以下XmlSerializer
:
為了提高性能,XML序列化基礎結構動態生成程序集以序列化和反序列化指定的類型。 基礎結構查找並重用這些程序集。 僅當使用以下構造函數時,才會發生此現象:
XmlSerializer.XmlSerializer(類型)
XmlSerializer.XmlSerializer(類型,字符串)
如果使用任何其他構造函數,則將生成同一程序集的多個版本,並且永遠不會將其卸載,這會導致內存泄漏和性能下降。 最簡單的解決方案是使用前面提到的兩個構造函數之一。 否則,您必須將程序集緩存在哈希表中,如以下示例所示。
在簡單的情況下,我將在靜態構造函數中為需要序列化的類構造XmlSerializer
,而不是HashTable
。 這是相當懶惰的,並且保證是線程安全的。 因此,例如:
public class NoParameterlessConstructor
{
public string Value { get; set; }
public NoParameterlessConstructor(string value)
{
this.Value = value;
}
}
public class BaseClass
{
public NoParameterlessConstructor NoParameterlessConstructor { get; set; }
}
public class DerivedClass : BaseClass
{
static XmlSerializer serializer = null;
static DerivedClass()
{
var xOver = new XmlAttributeOverrides();
var attrs = new XmlAttributes() { XmlIgnore = true };
xOver.Add(typeof(BaseClass), "NoParameterlessConstructor", attrs); // Must use BaseClass here not DerivedClass!
serializer = new XmlSerializer(typeof(DerivedClass), xOver);
}
public static XmlSerializer DerivedClassXmlSerializer { get { return serializer; } }
public int Id { get; set; }
}
然后,進行測試:
public static class TestNoParameterlessConstructor
{
public static void Test()
{
var derived = new DerivedClass { Id = 1, NoParameterlessConstructor = new NoParameterlessConstructor("Test") };
var xml = XmlSerializationHelper.GetXml(derived, DerivedClass.DerivedClassXmlSerializer);
Debug.WriteLine(xml);
}
}
哪個輸出
<?xml version="1.0" encoding="utf-16"?>
<DerivedClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Id>1</Id>
</DerivedClass>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.