Java:通用序列化方法
是否可以创建泛型序列化方法?在其中我可以传递任何对象并根据它的类序列化它?大概是这样的:Java:通用序列化方法,java,generics,serialization,Java,Generics,Serialization,是否可以创建泛型序列化方法?在其中我可以传递任何对象并根据它的类序列化它?大概是这样的: public void serializeObject(T Object) { try (ObjectOutputStream clientOutputStream = new ObjectOutputStream(socketConnection.getOutputStream());) { clientOutputStream.writeObject(Object);
public void serializeObject(T Object) {
try (ObjectOutputStream clientOutputStream = new ObjectOutputStream(socketConnection.getOutputStream());) {
clientOutputStream.writeObject(Object);
System.out.println(user.getUsername());
//clientOutputStream.close();
} catch (Exception e) {
System.out.println(e);
}
}
您可以使用反射来构建类似的东西。检查要转储的对象;检索其所有字段;然后尝试序列化这些。当然,这将变得很难,因为您必须检测“循环”,以避免序列化A指向B指向C指向A
你必须理解所有微妙的问题,比如拥有内在的物体等等。严肃地说:这很难
那么:在这个挑战中,序列化甚至不是真正的问题
问题是从序列化数据中重建泛型类的对象
因此,真正的答案是:这是一项高级任务,你很容易浪费很多时间。意思是:你宁愿退一步,澄清你的需求。与其重新发明轮子,不如用你的精力找到一个符合你需要的现有框架。开始阅读。尝试现成的映射器,例如Jackson JSON映射器
import com.fasterxml.jackson.databind.ObjectMapper;
ObjectMapper mapper = new ObjectMapper();
String jsonInString = mapper.writeValueAsString(yourObject);
YourClass yourObject = mapper.readValue(jsonInString, YourClass.class);
无法创建泛型序列化程序。相反,您可以将对象转换为支持序列化的公共对象 例如,您可以使用
GSON
将对象转换为字符串并序列化字符串。在反序列化过程中,您将反序列化的字符串对象传递给gson以取回对象
public <T> void serializeObject(T object) throws Exception{
Gson gson = new Gson();
String stringToSerialize = gson.toJson(object).toString();
try(ObjectOutputStream oStream = new ObjectOutputStream(new FileOutputStream("generic.ser"))){
oStream.writeObject(stringToSerialize);
}
}
public <T> T deSerializeObject(Class className) throws Exception{
Gson gson = new Gson();
try(ObjectInputStream iStream = new ObjectInputStream(new FileInputStream("generic.ser"))){
String object = (String)iStream.readObject();
return (T) gson.fromJson(object,className);
}
}
public void序列化对象(T对象)引发异常{
Gson Gson=新的Gson();
字符串stringToSerialize=gson.toJson(object.toString();
try(ObjectOutputStream oStream=newobjectoutputstream(newfileoutputstream(“generic.ser”)){
oStream.writeObject(stringToSerialize);
}
}
公共T反序列化对象(类className)引发异常{
Gson Gson=新的Gson();
try(ObjectInputStream iStream=newobjectinputstream(newfileinputstream(“generic.ser”)){
字符串对象=(字符串)iStream.readObject();
返回(T)gson.fromJson(对象,类名);
}
}
当然,这种解决方案会带来性能下降。这完全取决于我们的需求。现在的问题是:为什么需要泛型<代码>public void Serializable object(Serializable object)就足够了。因为我有很多类需要序列化并发送到服务器,然后修改并发送回客户端并在那里反序列化。所以我不想为所有的方法编写这些方法。你不需要。您的所有对象都实现了
Serializable
,因此使用它作为参数类型是find。如果你真的想使用泛型,那么就使用Serializable
作为T
的上限。如果你想要易于使用并且可以使用JSON或XML等标准格式,就使用为此目的构建的库。Jackson将自动序列化和反序列化您提供的对象。要扩展Tom所说的内容,您会注意到writeObject
方法接受任何对象,而不是任何特定类型的对象。因此,您无需为每个类编写不同的方法。Java自动检查对象是什么类,并将其序列化。将自己限制为可序列化
只会防止抛出异常。在这一部分上,我完全同意“…你很容易浪费很多时间”。这确实是一个挑战,最适合于基本对象类型。但它也释放了一些有趣的序列化和隐藏的对象流方面的宝藏。我认为在尝试实现这一点时可以学到很多东西。问题是:一个人有时间吗?有没有一个B计划,当思考最终不起作用时(好吧,他们不会)