java - 完全序列化适用于任何 Java 对象的对象图
问题描述
如何完成一个对象的序列化,这样它将通过网络发送并仍然满足:
Object ref = ...;
byte[] serialized = serialize(ref);
Object deserialized = deserialize(serialized);
Assert.assertEquals(ref, deserialized);
将以下代码视为用例:
有两台机器,一台机器(1)充当服务器,机器(2)充当客户端。
机器1:
@Get
public String getTransaction() {
Transaction tx = database.beginTransaction();
byte[] serialized = objectGraphSeralizer.serialize(tx);
return Base64Utils.toBase64(serialized);
}
机器2:
public void main() {
String base64EncodedTransaction = restClient.getTransaction();
String tx = base64EncodedTransaction; // let it be tx
try {
Entity entity = restClient.getEntity(tx, entityId);
entity = processEntityOrThrow(entity);
restClient.saveEntity(tx, entity);
restClient.commitTransaction(tx);
} catch(Exception e) {
restClient.rollback(tx);
}
}
机器 1 是创建事务对象(如在数据库事务中)的数据库服务器。该事务应该通过网络进行序列化,例如通过 HTTP/REST。客户端然后使用它来操作服务器以及在出现异常的情况下提交或回滚事务。
另请注意,在此示例中,REST 客户端是无状态客户端,因此所有请求都带有编码的事务有效负载。
序列化完整对象图(在本例中为事务)对象的方法是什么,因为它可以像这样通过线路发送?
解决方案
@Stephen C 的回答很好地解释了什么可以序列化,什么不能序列化。但是,默认的 java 序列化是一个非常糟糕的主意。对于初学者来说,不能保证它在不同版本的 Java 之间是兼容的。在过去几年中,最流行的序列化和反序列化方法是 JSON 格式,尤其是 JSON-JACKSON 库,也称为 FasterXML。这个特定的库是事实上的序列化-反序列化标准。Soring boot 默认使用它来序列化/反序列化 REST API 的流量。这是图书馆的主页:FasterXML / jackson。这里是获取 Maven 工件的地方:Jackson Core有关于如何使用它的教程。这里只是一个例子:杰克逊 JSON 教程. 特别是,您需要了解如何使用 ObjectMapper 类 - 这是另一个教程,也是众多教程之一:杰克逊 ObjectMapper 简介。
您的另一个选择是 Gson - 也很受欢迎的 Google JSON 库。这是一篇比较两者的文章:ackson vs Gson。另一个选择是 Bson - 它是支持二进制有效负载的 Gson
推荐阅读
- apache-kafka - 访问 Kafka 流转换历史的选项?
- python - 如何使用交叉验证模型获取系数
- python - 收敛失败的例子
- angular - 如何在所有组件之间共享一个 api 数据实例?
- mysql - 对 HIVE 中多个表的联合相同列的简明查询
- angular - Angular 7 注册角色
- clojure - 如何使用 clojure 生成 yaml 文件而不是创建 esxi vmmachine?
- python - Numpy:如何将数组的最大值选择到另一个数组中
- android - 在 Android 应用中集成 Linkedin V2.0 / OAuth2.0
- laravel - Laravel 模拟路由中带参数的单元测试中间件