簡體   English   中英

在非序列化方法上對不可序列化對象進行XML序列化時出錯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM