问题描述
我正在尝试将对象上传到 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。