I'm trying to serialize generic classes. My code is looking like following :
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);
}
}
Then I store my entities in a container that looks like this :
[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);
}
}
And finally, I serialize and deserialize like this :
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);
}
The serialization(save) is done fine. Well, I thing so. But for the deserialisation(load), the problem is that the contructor of StringEntity is never called.
I guess it's a problem with the generics ? (I'm from c++, I'm certainly misunderstanding something about c# generics).
Any idea ?