Tôi nhận ra nó đã được thiết lập tốt ở nơi khác mà việc tuần tự hóa các đối tượng miền NHibernate của bạn thường là một ý tưởng tồi. Câu hỏi của tôi ở đây là cố gắng hiểu cách hoạt động của BinaryFormatter
và tại sao kịch bản dưới đây mang lại hiệu suất InvalidCastException
.Tại sao BinaryFormatter cố gắng truyền một đối tượng kiểu được đánh dấu [Serializable] thành IConvertible?
Cấu trúc lớp khoảng trông như thế này:
[Serializable]
public class Parent
{
public virtual Child child{get; set;}
}
[Serializable]
public class Child
{
public virtual ICollection<GrandChild> GrandChildren { get; set; }
}
[Serializable]
public class GrandChild
{
public virtual Pet pet{get; set;}
}
[Serializable]
public class Pet
{
public virtual IList<Toy> Toys { get; set; }
}
[Serializable]
public class Toy
{
public string ToyName { get; set; }
}
Phương pháp serialization trông như thế này:
public static byte[] Serialize(this object t)
{
using (var ms = new MemoryStream())
{
BinarySerializer.Serialize(ms, t);
return ms.ToArray();
}
}
Đôi khi gọi serialization ví dụ
Parent p = new Parent() ....;
p.Serialize();
tôi sẽ nhận được
Không thể cast đối tượng của loại 'NHibernate.Collection.Generic.PersistentGenericBag`1 [Toy]' gõ 'System.IConvertible'.
(tất cả các bộ sưu tập được ánh xạ với ngữ nghĩa của túi).
Thậm chí NHibernate.Collection.Generic.PersistentGenericBag<T>
được đánh dấu [Serializable]
Vì vậy, cho rằng tất cả mọi thứ ở đây được đánh dấu là [Serializable]
tại sao BinaryFormatter
được cố gắng đúc PersistentGenericBag
một IConvertible ở nơi đầu tiên?
Edit: Trong trường hợp nó có liên quan, đây là dưới .NET 3.5 và NHibernate 3.1.0
Bạn nói điều này xảy ra "đôi khi" khi tuần tự hóa - mã này có được sử dụng trong ứng dụng đa luồng không? – LukeH
Nó được sử dụng trong một ứng dụng web, nhưng theo kịch bản tôi thấy, tôi nghĩ rằng nó có lẽ không phải là một vấn đề đồng thời. Dường như nó có thể có nhiều khả năng liên quan đến việc tải chậm hơn. – Nathan