java - Java依赖对象序列化一致性
问题描述
我有 Employee 包含 Address 并且两者都是可序列化的。但是当我进行序列化测试时它失败了,我看到该地址有不同的 Id
序列化:地址@6adca536 反序列化:地址@6b143ee9 我不确定是否需要实现自己的序列化。
public class EmployeeTestU extends BaseUnitTest {
private Employee employee;
private Address address
@Before
public void setUp() {
employee = new Employee();
employee.setName("Foo:);
employee.setId(1l);
Address address = new Address();
address.setPincode("23433");
address.setArea("testArea");
List<Address> addressList = new ArrayList<>();
addressList.add(address);
employee.setAddress(addressList);
}
@Test
public void testConsistency() throws IOException, CloneNotSupportedException, ClassNotFoundException{
byte[] serialized1 = serialize(employee);
byte[] serialized2 = serialize(employee);
Object deserialized1 = deserialize(serialized1);
Assert.assertEquals(employee, deserialized1);
}
public class Employee implements Serializable {
private static final long serialVersionUID = -5991582870430548008L;
private Long id;
private List<Address> addresses;
private String name;
public Employee() {
}
//getter setter and default consutructor
}
public class Address implements Serializable{
private static final long serialVersionUID = -5991582870430548008L;
private String pincode;
private String area;
private String state;
//getter setter and default consutructor
}
解决方案
Assert.assertEquals(Object, Object)
使用该Object.equals
方法来测试相等性。
您的序列化工作正常。没有的是您对默认Object.equals
方法的假设。
默认Object.equals
将比较对象的引用,而不是对象的状态。并且由于反序列化实际上是对象的构造,因此以下...
byte[] serialized1 = serialize(employee);
Object deserialized1 = deserialize(serialized1);
...创建一个新对象。deserialized1
is not employee
:它是通过反序列化新创建的对象。这个新对象有另一个引用,测试失败。
按照@Ivan 的建议Object.equals
覆盖并实施。Object.hashCode
推荐阅读
- ios - 如何从主 ViewController 访问自定义 UITableViewCell
- c# - C# .net:将图像添加到列表并显示在表单上
- visual-studio - 将多个自动化结果报告合二为一
- javascript - 如何在 TypeScript 中编写有效的 JS 表达式 [...Array(5).keys()] 而不会出错?
- android - 中心为椭圆形的LinearLayout
- python - 无法写入 xslx 文件,它说有一个属性错误
- java - 转换期间Java中的解析错误
- firebase - 获取父 uid 数据
- node.js - ffmpeg 安装在现有的 Node.js docker 镜像中
- node.js - 无法以角度创建新项目