首页 > 解决方案 > 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

}

标签: javaserialization

解决方案


Assert.assertEquals(Object, Object)使用该Object.equals方法来测试相等性。

您的序列化工作正常。没有的是您对默认Object.equals方法的假设。

默认Object.equals将比较对象的引用,而不是对象的状态。并且由于反序列化实际上是对象的构造,因此以下...

byte[] serialized1 = serialize(employee);
Object deserialized1 = deserialize(serialized1);

...创建一个新对象。deserialized1is not employee:它是通过反序列化新创建的对象。这个新对象有另一个引用,测试失败。

按照@Ivan 的建议Object.equals覆盖并实施。Object.hashCode


推荐阅读