如何在 Java 中使用 Base64 对未实现可序列化接口的对象进行编码?



我在一个组织中工作,我们想将对象转换为字符串表示形式,然后使用Base64对其进行编码。Java中的编码器。 但问题是,我们从其他系统接收的对象没有实现可序列化接口

如果它没有实现可序列化接口,那么我们如何将对象转换为字符串表示形式,而不管对象的类型如何?

你必须"手动"完成它。

如果要序列化的对象是一个简单的java bean(简单成员,getter,setter(,我将使用JSON序列化程序。

如果它更复杂,则必须自己实现序列化/反序列化方法。

JSON 的序列化格式已采用文本形式,因此无需将其转换为 Base64。Base64 旨在用于将二进制内容转换为可读/可传输的字符串表示。

杰克逊的简单例子:

JarEntry obj = new JarEntry("Hello World"); 
ObjectMapper objectMapper = new ObjectMapper(); 
String json = objectMapper.writeValueAsString(obj);
System.out.println(json);

您可以使用ObjectMapperDatatypeConverter来回编码和解码 base64,专门针对您的类未实现Serializable的用例。

public static String encode(AccessClient object) throws IOException{
ObjectMapper mapper = new ObjectMapper();
return DatatypeConverter.printBase64Binary(mapper.writeValueAsBytes(object));
}

public static AccessClient decode(String base64) throws IOException{
byte [] bytes =  DatatypeConverter.parseBase64Binary(base64);
ObjectMapper mapper = new ObjectMapper();
return mapper.readValue(bytes,AccessClient.class);
}

测试结果 :

public static void main(String [] args) throws IOException {
AccessClient accessClient = new AccessClient();
accessClient.setId("id");
accessClient.setClientId(new BigInteger("200000"));
accessClient.setClientName("clientName");
String base64 = encode(accessClient);
System.out.println(base64);
System.out.println(decode(base64).toString());
}

-----------------------输出-------------------------- eyJpZCI6ImlkIiwiY2xpZW50SWQiOjIwMDAwMCwiY2xpZW50TmFtZSI6ImNsaWVudE5hbWUiLCJjbGllbnRBdHRyaWJ1dGVzIjpudWxsfQ==

AccessClient{id='id', clientId=200000, clientName='clientName', clientAttributes=null}

由于我找不到杰克逊左右的标签,这是我的 gson 替代方案:

Gson gson = new Gson();
NonSerializable ns = new NonSerializable(); // not implementing Serializable
// encode
byte[] b64 = Base64.getEncoder().encode(gson.toJson(ns).getBytes()); 
// decode
NonSerializable decoded = gson.fromJson(new String (Base64.getDecoder().decode(b64)),
NonSerializable.class);

另请参阅:Java 序列化为字符串