簡體   English   中英

Base64反序列化期間的空引用異常(C#)

[英]Null reference exceptions during Base64 deserialization (C#)

我使用以下方法序列化和反序列化.NET對象:

public static string SerializeToBase64(object data)
{
    var stream = new MemoryStream();
    var formatter = new BinaryFormatter();
    formatter.Serialize(stream, data);
    stream.Position = 0;
    return Convert.ToBase64String(stream.ToArray());
}

public static object DeserializeFromBase64(string data)
{
    var stream = new MemoryStream(Convert.FromBase64String(data));
    stream.Position = 0;
    var formatter = new BinaryFormatter();
    return formatter.Deserialize(stream);
}

使用標有[Serializable]屬性的簡單類時,這些方法似乎工作正常。

但我需要使用此代碼來序列化由ORM框架創建的實體類(也稱為Serializable),其中每個實體類都是從我沒有源代碼的基類派生的。

使用實體類的實例時,它完成序列化而沒有異常,但反序列化總是在執行formatter.Deserialize()時拋出空引用異常。

我不太熟悉序列化的過程,但我認為這個問題必定是由目標對象狀態中的異常引起的。 在序列化之前,對象必須滿足一組標准標准嗎?

任何其他調試建議將不勝感激。

蒂姆,謝謝

更新:

經過進一步的實驗,我想我已經找到了問題的原因。 目標物體具有通過如上述未標記為可序列,另一個類處理的事件此篇

有趣的是,即使附加了事件處理程序,serialaztion也能正常工作 - 它的反序列化失敗了。

但我已通過暫時刪除事件處理程序進行測試,序列化和反序列化都正常工作,所以我認為這是問題所在。 但是,由於我無法訪問聲明事件的代碼,因此我無法立即了解如何實現上述解決方案。 可能是我必須修改我的序列化過程以刪除然后恢復事件處理程序。

它是哪個ORM框架? 請注意,與BinaryFormatter使用時,ORM生成的類型往往特別令人討厭,因為它們並不總是“POCO”:它們通常具有與ORM相關的字段 - 因此獨立創建它們會產生問題。 總之,我並不感到驚訝巨大的 ,它不會在這種情況下工作。

您可能想要考慮使用像DataContractSerializerXmlSerializer ,protobuf-net或NetDataContractSerializer - 這些都做類似的工作,但因為它們在公共屬性(而不是字段)上工作,它們往往更有效 - 事實上很多都有內置支持這些方法用作DTO。

你可以在ORM基類組件上使用Reflector嗎? 可能存在一些導致異常的自定義反序列化代碼(即它實現了ISerializable接口)。 如果您能找到這種情況,以及它正在做什么,您可能能夠在子類的實例中設置足夠的狀態以防止它發生。 另一方面,如果它有一個bug,那么你有點不走運。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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