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计划,当思考最终不起作用时(好吧,他们不会)