将不可序列化的对象转换为 java

问题描述

我正在尝试将对象上传到 S3。 S3 需要 InputStream 中的对象。但是这个对象中的字段是不可序列化的,不能直接转换成InputStream。

所以我想到将对象中的每个字段转换为 InputStream,然后将它们附加到一个 InputStream 中或将它们添加到容器对象中。

但第一种方法的问题是我不知道如何将组合流分成单独的流。

在第二种方法中,我不知道任何容器 InputStream 对象。

有没有更简单的方法来处理这个问题?

我是 Java 初学者,任何帮助将不胜感激。

编辑:

看到@magicmn 推荐的帖子,也提到了this post

我的容器类:

public class ContainerClass implements Serializable {
    private String someString;
    private String someOtherString;
    private  transient NonSerializableObject1 object1;
    private  transient List<NonSerializableObject2> object2;
    private  transient NonSerializableObject3 object13;
} 

就我而言,问题是有一种方法可以将 3 个不可序列化对象转换为 byte[]。

所以我可以在 writeObject 中做这样的事情:

private void writeObject(final ObjectOutputStream objectOutputStream) throws IOException {
    objectOutputStream.defaultWriteObject();
    objectOutputStream.write(someMethodToconvertObject1ToByteArray());
    objectOutputStream.write(someMethodToconvertObject2ToByteArray());
    objectOutputStream.write(someMethodToconvertObject3ToByteArray());
 }

但是我对如何实现 readobject() 感到困惑。我不知道如何拆分 InputStream 以获取我在 writeObject() 中添加的 3 字节数组。

解决方法

我就是这样解决的。这可能不是一个理想的解决方案,但目前可以使用。

public class ContainerClass implements Serializable {
    private String someString;
    private String someOtherString;
    private  transient NonSerializableObject1 object1;
    private  transient List<NonSerializableObject2> object2;
    private  transient NonSerializableObject3 object3;

    private void writeObject(final ObjectOutputStream objectOutputStream) throws IOException {
        objectOutputStream.defaultWriteObject();
        objectOutputStream.write(someMethodToconvertObject1ToByteArray());
        objectOutputStream.write(someMethodToconvertObject2ToByteArray());
        objectOutputStream.write(someMethodToconvertObject3ToByteArray());
    }

    private void readObject(final ObjectInputStream objectInputStream) throws ClassNotFoundException,IOException {
        objectInputStream.defaultReadObject();
        this.NonSerializableObject1 = (NonSerializableObject1) someMethodToConvertByteArrayToObject((byte[]) objectInputStream.readObject());
        this.NonSerializableObject2 = (NonSerializableObject1) someMethodToConvertByteArrayToObject((byte[]) objectInputStream.readObject());
        this.NonSerializableObject3 = (NonSerializableObject1) someMethodToConvertByteArrayToObject((byte[]) objectInputStream.readObject());
    }

} 

注意写入和读取对象的顺序必须相同。

,

您可以使用 Jackson 库的 ObjectMapper 类的 writeValueAsBytes() 将对象序列化为字节数组(example),然后使用 ByteArrayInputStream 将字节数组转换为 InputStream。