我有一个服务器(Java)/客户端(Android)应用程序,在服务器端,根据请求我通过ObjectOutputStream发送3种类型的对象。
对象类型如下:
在java服务器端:
//My serializable classA
MySerializableClassA classA = MySerializableClassA(A, B, C);
out.WriteObject(classA);
//Arraylist of my serializable classB
ArrayList<MySerializableClassB> classB = new ArrayList<MySerializableClassB>();
classB.add(new MySerializableClassB(E, F, G, H));
out.writeObject(classB);
//Arraylist of my serializable classC
ArrayList<MySerializableClassC> classC = new ArrayList<MySerializableClassC>();
classC.add(new MySerializableClassC(Y, X, Z));
out.writeObject(classC);
在Android客户端:
Object obj
private MySerializableClassA classA;
private ArrayList<MySerializableClassB> arrayClassB;
private ArrayList<MySerializableClassC> arrayClassC;
//Here i get the object received, i store it in a Object
in = new ObjectInputStream(_socket.getInputStream());
obj = in.readObject();
//And I check of which class is an instance
if(obj instanceof MySerializableClassA){
classA = (MySerializableClassA)obj;
//Do a specific action
}
问题从这里开始,因为从Object到ArrayList的转换是未选中的,
//I check if object is instanceof ArrayList...
else if(obj instanceof ArrayList){
//and here a need to identify the type of the object inside the arraylist , so...
if(the object inside is an instanceof MySerializableClassB){
arrayClassB = (ArrayList<MySerializableClassB>)obj;
//Do a specific action
}
else if(the object inside is an instanceof MySerializableClassC){
arrayClassC = (ArrayList<MySerializableClassC>)obj;
//Do a specific action
}
}
所以我的问题是: 有没有办法确定什么类型的costum arraylist包含我的对象? 或者在这种情况下确定哪种类型的对象包含我的arraylist?
此外,我可以选择将classB和classC合并到一个类中......但如果我可以按照上面的要求进行操作,那就更好了。
欢迎任何帮助或建议其他方式做我想做的事,谢谢。
答案 0 :(得分:0)
您遇到的问题称为type erasure。在运行时,无法从List<A>
中识别List<B>
。您可以通过使用类似
Class<T> getItemType();
或创建两个不同的ArrayList子类,然后使用getActualTypeArguments()
。第二种选择会很奇怪。
如果您的用例允许,最简单的方法是遍历列表并决定每个项目。检查对每个项目产生的结果都无关紧要。
将列表包装到携带项类型的对象中会向流中添加一些元数据。如果要避免创建该包装器,可以在每个列表之前手动将类型写入流,从而定义自定义协议。如果你走这条路,请考虑protobuf或类似。