我想反序列化一个序列化对象来映射
class Person {
private String name;
private int age;
// getters setters
}
我想在另一个应用程序中读取此对象,但我没有在classpath中使用此类(并且我无法控制序列化),因此它将抛出ClassNotFoundException。但我想知道字段信息,如name=hendrix, age=27
。我怎么能做到这一点,是否有图书馆这样做?
Java序列化一个对象,它必须将字段和值写入字节数组,必须有一种方法将它反序列化为一个映射,我想知道是否有人已经为我们做了这项工作......
答案 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:
请看这个:
答案 2 :(得分:1)
正如评论中所写,您可以使用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);
在阅读方面,您具有与上述相同的可能性。
// 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");
// 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");