java - 在 Java 中使用字节数组序列化一个类

标签 java serialization bytearray deserialization

我有一个 Java 字节数组类。当我序列化和反序列化类的对象时,字节数组的值在变化。

我该如何解决这个问题?

请看示例代码:

public class Test implements Serializable{

private static final long serialVersionUID = 3455892176538865707L;
public byte[] datakey;

public static void main(String[] args) {

    byte[] key=new byte[16];    
    Random rn = new Random(); //Trying to randomize the byte array to use as a cryptographic key
    rn.nextBytes(key);

    Test test = new Test();
    test.datakey=key;
    System.out.println("Byte Array Before serialization : "+test.datakey);
    test.serializeTest(test);
    Test loadedtest=test.deserializeTest();
    System.out.println("Byte Array After deserialization : "+loadedtest.datakey);


}


public void serializeTest(Test test)
{

    FileOutputStream fos;
    try {

            fos = new FileOutputStream("test.out");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(test);
            oos.flush();
            oos.close();;
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

public Test deserializeTest()
{
    Test test=null; 
    String f="test.out";
    try
    {
            FileInputStream fis = new FileInputStream(f);
            ObjectInputStream ois = new ObjectInputStream(fis);
            test = (Test)ois.readObject();
            ois.close();
            fis.close();

    }
    catch(FileNotFoundException ex)
    {
            ex.printStackTrace();
    } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    }

    return test;
}
}

输出:

Byte Array Before serialization : [B@15db9742
Byte Array After deserialization : [B@75b84c92

最佳答案

字节数组的值没有改变。您只是打印数组的 toString() 表示。

将使用 java.lang.Object 中的默认 toString() 实现。

因为初始数组和反序列化数组不是同一个对象(它们是两个内容相同的独立对象),它们会有不同的hashCode()Java 中的数组不会覆盖 equals()hashCode()

您应该使用 Arrays.toString() 来打印数组的内容。

关于java - 在 Java 中使用字节数组序列化一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29586709/

相关文章:

python - 将 python long/int 转换为固定大小的字节数组

java - 如何在java中创建可检查的 ListView

java - 使用Spring CachingConnectionFactory时什么时候适合缓存Consumers?

c - 在 C 中序列化数据结构

c# - 如何将 Json 嵌套属性获取到主要属性

c# - 接口(interface)的 XML 序列化

asp.net-mvc-3 - 在Razor/MVC3中显示数据库图像(字节[])?

.net - 我应该使用 Base64 编码还是 byte[] 在 .NET Web 服务中返回二进制数据

java - JCP/SCJP 考试问题必须完整(即可编译)吗?

java - jtextarea不弹出