反序列化序列化对象以在java中映射

时间:2016-09-30 11:28:44

标签: java serialization deserialization

我想反序列化一个序列化对象来映射

class Person {
    private String name;
    private int age;

    // getters setters
}

我想在另一个应用程序中读取此对象,但我没有在classpath中使用此类(并且我无法控制序列化),因此它将抛出ClassNotFoundException。但我想知道字段信息,如name=hendrix, age=27。我怎么能做到这一点,是否有图书馆这样做?

Java序列化一个对象,它必须将字段和值写入字节数组,必须有一种方法将它反序列化为一个映射,我想知道是否有人已经为我们做了这项工作......

3 个答案:

答案 0 :(得分:1)

在将其写入文件之前,您可以将其转换为Map,然后将其序列化。

public static Map<String, String> convertPersonToMap(Person person){
    Map<String, String> returnedMap = new HashMap<>();
    returnedMap.put("name", person.getName());
    returnedMap.put("age", Integer.toString(person.getAge()));
    return returnedMap;
}

然后序列化Map对象。在读取文件的程序中,您可以将文件反序列化回Map对象。这是因为Map实现了Serializable

答案 1 :(得分:1)

在反序列化类时,您需要在类路径中包含类文件。

如果要将一个类从流的一端传输到另一端,可以将.class文件本身推送到流上,将其保存到文件中,然后使用ClassLoader:

请看这个:

http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html#defineClass%28java.lang.String,%20byte%5B%5D,%20int,%20int%29

答案 2 :(得分:1)

正如评论中所写,您可以使用JSON作为编程语言和系统独立的数据格式。

编写JSON

如果您的代码在Java EE环境中运行,则可以使用内置的Java API进行JSON处理(JSR-353)。不幸的是它确实支持对象映射,因此您必须自己完成:

// get Person to serialize
Person p = ...
// create intermediate JsonObject
JsonObject obj = Json.createObjectBuilder()
        .add("name", p.getName())
        .add("age", p.getAge())
        .build();
// write Json Object to Writer or OutputStream
Json.createWriter(outputStream).write(obj);

在Java SE端,您可以下载实现JSR-353的库,例如: https://jsonp.java.net处的参考实现,或使用任何其他JSON库。

例如,使用Jackson,上面的代码简化为:

// get Person to serialize
Person p = ...
// create ObjectMapper
ObjectMapper mapper = new ObjectMapper();
// serialize Person to File, Writer or OutputStream
mapper.writeValue(file, p);

阅读JSON

在阅读方面,您具有与上述相同的可能性。

JSON-P:

// create JsonReader from file InputStream
JsonReader r = Json.createReader(inputStream);
// parse JSON into intermediate JsonObject
JsonObject obj = r.readObject();
// get fields directly from JsonObject:
String name = obj.getString("name");
String age  = obj.getInt("age");

Jackson

// create ObjectMapper
ObjectMapper mapper = new ObjectMapper();
// read file and parse JSON into java.util.Map
Map<String, Object> map = mapper.readValue(file, Map.class);
// get fields from map
String name = (String)map.get("name");
int age  = (Integer)map.get("age");