c# – 通过仅在基类中定义serialize方法来序列化具有继承的对象?
作者:互联网
我目前正在用C#进行游戏(用于研究目的).我正在尝试实现加载/保存功能,其中包括将游戏的每个数据保存在文件中,并且用户可以重新加载之后保存的游戏.
在游戏中,每个玩家都有一个国家级,每个国家都从国家继承.目前,我只在基类Nation上应用ISerializable接口,因为子类只有方法覆盖而没有新的属性来序列化.
[Serializable()]
public abstract class Nation : ISerializable
{
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
// save attributes
}
public Nation() { } // default constructor, to be able to do "new NationDwarf()" for example.
// Deserialization constructor.
public Nation(SerializationInfo info, StreamingContext ctxt)
{
// retrieve attributes
}
}
public class NationDwarf : Nation {
// some methods override
}
public class NationViking : Nation {
// some methods override
}
节约似乎很好.但是当我尝试使用此方法检索数据(反序列化)时,我得到一个异常(第一个玩家有一个NationDwarf):
SerializationException
The constructor is missing for deserialize an object of type ‘SmallWorld.NationDwarf’.
所以,我的问题是:我是否需要为每个子类指定它是可序列化的并重新定义每个方法(GetObjectData和构造函数)?有没有办法保持多态性并序列化每个子类,当然能够在反序列化时获得正确的类型?
我没有找到任何解决方案,除了重新定义每个子类的序列化方法,这有点重…
谢谢,
解决方法:
您只需提供序列化构造函数并在基类中创建GetObjectData虚拟,以便可以在子类中覆盖它.
public NationDwarf(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
虽然ISerializable接口是从基类传递的,但运行时仍然需要知道如何专门创建派生类的实例.
标签:c,serialization,binaryformatter 来源: https://codeday.me/bug/20190612/1226820.html