2011-07-08 47 views
3

我是序列化的新手,所以这可能是一个简单的问题,但是我的google-fu今天很弱。反序列化已知超类的随机派生类

假设有以下类:

public class Base implements Serializable { 
    // ... 
} 

public class Der1 extends Base { 
    // ... 
} 

public class Der2 extends Base { 
    // ... 
} 

爱丽丝随机创建任一Der1Der2的目的,将其序列到一个文件,并把它发送给Bob。 Bob知道这个对象的类是Base的一个子类,但不知道哪一个(他具有与Alice相同的类定义)。 Bob如何反序列化文件以成为适当子类的实例?

我首先想到的是,爱丽丝可以定义一个类是这样的:

public DerClass implements Serializable { 
    public Class<? extends Base> class; 
} 

她用它来存储对象的类,其序列,并将其发送给Bob。 Bob从这个文件构造一个DerClass对象,读取class变量,用它来实例化正确的子类,并将序列化对象读入它。这会工作吗?有没有更好的办法?

+1

我总是怀疑人们是从这些“随机班级”中获得的。这里的实际情况是什么?您的序列化格式必须包含一些信息,以便在任何情况下进行标识。 –

+0

@suszterpatt:我想如果你在这里为Bob写代码,你的问题会更友好。 –

回答

5

反序列化应用程序不需要知道类型,它只需要在类路径中具有相同的类。例如Alice需要拥有Bob可能发送的所有类以及他们的父母和家属。

// Bob sends 
Base base = // some Base class 
objectOutputStream.writeObjec(base); 

// Alice receives 
Base base = (Base) objectInputStream.readObject(); 
+0

但是这样,Alice不会知道'base'的派生类型。她可能想要使用实际派生类型“Der1”或“Der2”。如何解决这个问题? –

+1

@JonasGröger她可以做'if(base instanceof Der1){Der1 der1 =(Der1)base;/* something * /} else if(base instanceof Der2)...' –

+0

这涉及到每次有新子类时都要更改序列化算法 - 哪种类型很烂? –