gpt4 book ai didi

java - 高效的Java序列化: Using ByteOutputArrayStream?

转载 作者:行者123 更新时间:2023-12-01 11:47:03 29 4
gpt4 key购买 nike

我一直在努力寻找一种有效的方法来序列化特定类以在我的服务器和客户端之间传递,并且一直在使用 ByteOutputArrayStream传递字节数组。然而,this article让我想知道我是否应该使用 ByteOutputArrayStream。这是我用来序列化和反序列化名为 PackagesData 的类的编解码器:

public final PackagedData decode(final byte[] data) {
final ByteArrayInputStream bstream = new ByteArrayInputStream(data);
final PackagedData result;

try (final ObjectInputStream ois = new ObjectInputStream(bstream)) {
result = (PackagedData)ois.readObject();
}catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e.getCause());
}
return result;
}

public final byte[] encode(final PackagedData packagedData) {
final ByteArrayOutputStream bstream = new ByteArrayOutputStream();

try (final ObjectOutputStream oos = new ObjectOutputStream(bstream)) {
oos.writeObject(packagedData);
}
catch (IOException e) {
throw new RuntimeException(e.getCause());
}
return bstream.toByteArray();
}

PackagesData看起来像:

public final class PackagedData implements Serializable {
private final String dataType;
private final String key;
private final Integer value;

public PackagedData(final String dataType, final String key, final Integer value) {
this.dataType = dataType;
this.key = key;
this.value = value;
}
public final String getType(){
return dataType;
}
public final String getKey() {
return key;
}
public final Integer getValue() {
return value;
}
}

我的两个问题是:我应该使用 ByteArrayOutputStream 吗?如果是这样,我应该在参数中将缓冲区大小设置为多少?我了解 ByteArrayOutputStream 根据需要增加缓冲区大小,但我认为这比一开始就以适当的缓冲区大小初始化它需要更多的资源和时间。

提前谢谢您。

最佳答案

如果你想让你的对象序列化更加高效,我强烈建议你实现Externalizable类似的东西

public final class PackagedData implements Externalizable {
private String dataType;
private String key;
private Integer value;

public PackagedData(final String dataType, final String key,
final Integer value) {
this.dataType = dataType;
this.key = key;
this.value = value;
}

public String getType() {
return dataType;
}

public String getKey() {
return key;
}

public Integer getValue() {
return value;
}

@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeUTF(this.dataType);
out.writeUTF(this.key);
out.writeInt(this.value);
}

@Override
public void readExternal(ObjectInput in) throws IOException,
ClassNotFoundException {
this.dataType = in.readUTF();
this.key = in.readUTF();
this.value = in.readInt();
}
}

如果序列化 PackageData 确实是关键代码,您应该会看到显着的性能改进。

关于java - 高效的Java序列化: Using ByteOutputArrayStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068892/

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