Java:通用序列化方法

时间:2017-04-12 11:31:20

标签: java generics serialization

可以制作通用的序列化方法吗?我可以在其中传递任何对象并根据它的类序列化它?像这样:

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);
    }
}

3 个答案:

答案 0 :(得分:1)

你可以使用反射来构建这样的东西。您检查要转储的对象;检索其所有字段;然后尝试序列化这些。当然,变成,因为你必须检测"周期",以避免序列化A指向B指向C指向回到A例如。

你必须要理解所有微妙的问题,比如拥有内在的物体等等。说真的:这是很难

然后:序列化不是这次挑战中的真正问题!

问题是从序列化数据重建泛型类的对象。

因此,真正的答案是:这是一项高级任务,您可以轻松浪费很多时间。含义:您宁愿退后一步,澄清您的要求。您应该利用自己的能量找到符合您需求的现有框架,而不是重新发明轮子。开始阅读here

答案 1 :(得分:0)

尝试开箱即用的地图制作工具,例如杰克逊JSON映射器

import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper mapper = new ObjectMapper();
String jsonInString = mapper.writeValueAsString(yourObject);

YourClass yourObject = mapper.readValue(jsonInString, YourClass.class);

答案 2 :(得分:0)

无法创建Generic Serializer。相反,您可以将对象转换为支持序列化的公共对象。

例如,您可以使用GSON将对象转换为String并序列化字符串。在反序列化期间,将反序列化的字符串对象传递给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);
    }
}

当然,这种解决方案会降低性能。这完全取决于我们的要求。