泛型类的C#二进制序列化
我正在尝试序列化泛型类。我的代码如下所示:泛型类的C#二进制序列化,c#,generics,serialization,C#,Generics,Serialization,我正在尝试序列化泛型类。我的代码如下所示: public class Entity<DescriptorType> { // some **data** protected void Desezialize(SerializationInfo info, StreamingContext context) { // read **data** from info } protected void GetData(SerializationInf
public class Entity<DescriptorType> {
// some **data**
protected void Desezialize(SerializationInfo info, StreamingContext context) {
// read **data** from info
}
protected void GetData(SerializationInfo info, StreamingContext context) {
// fill info with class instance **data**
}
}
[Serializable]
public class StringEntity : Entity<string>, ISerializable {
private StringEntity (SerializationInfo info, StreamingContext context) {
Desezialize(info, context);
}
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.SerializationFormatter)]
public void GetObjectData(SerializationInfo info, StreamingContext ctxt) {
GetData(info, ctxt);
}
}
序列化(保存)完成得很好。嗯,我想是的。
但是对于反序列化(load),问题是永远不会调用StringEntity的构造函数。
我想这是泛型的问题吧?(我来自C++,我当然误解了C泛型的一些东西)。
有什么想法吗?BinaryFormatter或多或少地获取对象的内存表示形式,并将其写入流中。这使得它相当脆弱,对象内部表示的更改可能会使数据无法恢复。实际上,BinaryFormatter只是直接写入字段,绕过任何构造函数,请参阅。我认为这与泛型无关
我建议使用另一个序列化程序来控制对象的序列化方式。有许多备选方案允许您在保持向后/向前兼容性的同时添加或删除对象的属性。我可以推荐,或者内置xml序列化程序,但是还有很多其他选择。如果值为null,为什么要调用构造函数?你是什么意思?序列化步骤进展顺利,列表包含多个StringEntity类型的对象。构造函数应该由C#序列化程序(formatter.Deserialize())调用,不是吗?问题是二进制序列化程序非常适合我的需要。使用的内存(磁盘和RAM),非人类可读文件…@rod riggs请参阅。Protobuf.net既小又快。如果你想要更大的文件,你总是可以在末尾添加一些随机数据。我个人曾遇到过这样的问题:在升级到较新版本后,使用一个.Net版本的BinaryFormatter保存的数据不可读。
[Serializable]
public class EntityContainer: ISerializable {
public List<StringEntity> StringEntities;
private EntityContainer(SerializationInfo info, StreamingContext context) {
StringEntities = (List<StringEntity>) (info.GetValue("StringEntities", typeof(List<StringEntity>));
}
public void GetObjectData(SerializationInfo info, StreamingContext context) {
info.AddValue("StringEntities", StringEntities);
}
}
EntityContainer Load(string filename) {
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read);
return (EntityContainer) formatter.Deserialize(stream);
}
void Save(EntityContainer entities, string filename) {
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, entities);
}