gpt4 book ai didi

java - 有没有办法检测传入的序列化对象流是 GZIPOutputStream 压缩的还是简单的 ObjectOutputStream?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:29:06 34 4
gpt4 key购买 nike

我有一个遗留系统,服务器在数周内缓慢更新。层次结构是这样的:

1
2
3 4 5

1 is the client pc
2 is a master server
3 4 and 5 are servers across the country.

目前所有这些都以未压缩的格式来回发送 POJO(普通旧 java 对象)。想想 OjbectOutputStream() 等。

我想通过网络压缩正在序列化的数据,但这样做的方式是只压缩从查询中接收到的数据。向下发送的数据是微不足道的(查询过滤器数据)。

只有客户端 #1 和主服务器 #2 会立即更新。服务器#3、#4 和#5 可以相隔数周或数月进行更新。我需要一种方法让服务器 #2 能够检测从 #3、#4 或 #5 返回的流是否被压缩并相应地处理它(当它们升级时)。

-编辑-对于服务器 #3、#4 和 #5,该解决方案必须不显眼。如果发生异常,这些服务器没有重新发送数据的概念。

这是#2 用来与#3、#4 或#5 通信的代码示例:

    // Set the content type to be application/x-java-serialized-object
connection.setRequestProperty("Content-Type", "application/x-java-serialized-object");

setupHeaderAttributes(getHttpHeaders());

setupSessionCookies(getHttpHeaders());

// Load/add httpHeaders
addHeadersToConnection(connection, getHttpHeaders());

// Write the serialized object as post data
objectoutputstream = new ObjectOutputStream(connection.getOutputStream());
objectoutputstream.writeObject(obj);
objectoutputstream.flush();

// Get ready to receive the reply.
inputstream = connection.getInputStream();
setHttpStatus(connection.getResponseCode());

这可能吗?感谢您的宝贵时间。

-丹尼斯

最佳答案

@Puce 有一半的答案。另一半是使用 mark()reset() 重置流,如果它不是 GZipped 流:

    InputStream in = // stream from server
in = new BufferedInputStream(in);
in.mark(1024);

try {
in = new GZIPInputStream(in);
}
catch (ZipException ex) {
in.reset();
}

// "in" is now ready for use

BufferedInputStream 在这里有两个目的:首先,我知道它支持标记/重置。其次,如果底层流未被缓冲(尽管如果它是套接字流,它将被缓冲),它将提高 IO 性能。

标记值1024是任意值。 GZipInputStream 构造函数应该能够通过读取前两个字符来确定底层流是否经过 GZip 压缩。但是,GZIP header 有 10 个字节长,因此它可能会尝试读取更多内容。它不应读取超过 1024 个字节(如果超过,则增加标记值)。


编辑:因为我从您的编辑中看到您正在使用 Content-Type header ,您还可以使用它来选择性地解压缩流:新服务器将返回类似 x-application/java-gzipped 的内容-serialized-object 而旧服务器继续返回 x-application/serialized-java-object(或任何它是什么)。

以“x-”开头的内容类型不受限制;只要双方同意,您可以使用任何您想要的。

关于java - 有没有办法检测传入的序列化对象流是 GZIPOutputStream 压缩的还是简单的 ObjectOutputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16964794/

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