gpt4 book ai didi

java - 如何将对象二进制(反)序列化为/形成字符串?

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:02 25 4
gpt4 key购买 nike

我需要将对象序列化为 String 并反序列化。

我阅读了关于 stackoverflow 的建议并编写了这段代码:

class Data implements Serializable {
int x = 5;
int y = 3;
}

public class Test {
public static void main(String[] args) {

Data data = new Data();

String out;

try {
// zapis
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);

oos.writeObject(data);

out = new String(baos.toByteArray());
System.out.println(out);

// odczyt.==========================================

ByteArrayInputStream bais = new ByteArrayInputStream(out.getBytes());

ObjectInputStream ois = new ObjectInputStream(bais);

Data d = (Data) ois.readObject();

System.out.println("d.x = " + d.x);
System.out.println("d.y = " + d.y);

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

}

但我得到错误:

java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:801)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:298)
at p.Test.main(Test.java:37)

为什么?我期望:d.x = 5d.y = 3

如何做好?啊。我不想在文件中写入这个对象。我必须使用字符串格式。

最佳答案

使用
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); 而不是ByteArrayInputStream bais = new ByteArrayInputStream(out.getBytes());,因为字符串转换会破坏数据(因为编码)。

如果您确实需要将结果存储在字符串中,则需要一种安全的方法来将任意字节存储在字符串中。这样做的一种方法是对我们进行 Base64 编码。

一种完全不同的方法是不对此类使用标准的 Java 序列化,而是创建您自己的数据到/从字符串转换器。

关于java - 如何将对象二进制(反)序列化为/形成字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13568248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com