Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
泛型类的C#二进制序列化_C#_Generics_Serialization - Fatal编程技术网

泛型类的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);
}