0

我在数据库中持久化 Class 对象时遇到问题。

我尝试使用 object 将对象转换为字节数组ObjectArrayOutputStreamByteArrayOutputStream如下所示并将其持久化为字节数组:

Class klazz = getClassForClassDef();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(klazz);
baos.toByteArray();

但我收到如下所示的错误:

java.lang.ClassFormatError: Incompatible magic value 2901213189 in class file

我认为构造字节数组的方式有问题。但我不知道如何创建.class类对象的正确等价物。

4

3 回答 3

2

如果您真的想存储Class本身

您可以在此处阅读更多相关信息:https ://stackoverflow.com/a/2390763/1001027

如果您尝试存储 Object

您正在Class为该方法使用 as 参数writeObject。而不是这个,你应该使用你拥有的实例。


// write the class
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(objectToSerialize);

// this you need to store
byte[] data = baos.toByteArray();

// read it again (just a test)
ByteArrayInputStream bais = new ByteArrayInputStream(data);
Object restored = new ObjectInputStream(bais).readObject();

// write what came from the deserialization
System.out.println(restored);

在示例中,变量objectToSerialize将保存要存储的对象。


您确定要真正将 java 序列化对象存储到数据库中吗?有几个替代方案。您可以使用诸如 Hibernate 之类的 ORM 框架来创建正式模型。

如果您认为这太动态了,您可以使用 XML 序列化,例如 XStream 甚至 JSON 序列化,这会很好,因为它们是可读格式,这意味着您可以看到真正存储的内容,避免使用 Java 反序列化它应用程序只是为了检查状态。

于 2012-07-07T10:55:43.003 回答
1

要序列化一个对象,您必须将对象本身而不是它的类写入流。此外,对象实例必须实现Serializable接口,并且其所有内部字段都应该是可序列化的或瞬态的。

在您的代码中,oos.writeObject(klazz);您不应该编写,而是oos.writeObject(obj);提供obj您要保存的对象实例。

但是,如果您尝试将 Java 对象存储到数据库中(我们正在谈论关系数据库,不是吗?)我会将对象映射到表,将其每个属性存储为列的值。这样,您将能够使用 SQL 和列的值执行搜索和连接,但您不能索引二进制字段。

于 2012-07-07T10:47:27.807 回答
1

文件.class不是序列化的 Class 对象。这是完全不同的东西,您将无法使用任何简单的 Java 代码来生成它。但是,您为什么要这样做?您已经.class在磁盘上拥有该文件,这就是您的 Java 程序了解该类的方式。你为什么不直接复制那个.class文件?这只是找到它来自哪里(什么JAR)的问题。

于 2012-07-07T11:20:11.630 回答