Hessian将java.lang.Character反序列化为String

f4t66c6m  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(117)

我使用Hessian有一段时间了,但是注意到下面的行为:如果你用Hessian序列化一个java.lang.Character,它反序列化为String。

public class TestHessianChar {
    public static void main(String... args) throws IOException {
        // Serialize
        Character c = new Character('x');
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        Hessian2Output hessian2Output = new Hessian2Output( byteArrayOutputStream );
        hessian2Output.startMessage();
        hessian2Output.writeObject(c);
        hessian2Output.completeMessage();
        hessian2Output.close();
        byte[] dataBytes = byteArrayOutputStream.toByteArray();

        // Deserialize
        Hessian2Input hessian2Input = new Hessian2Input( new ByteArrayInputStream(  dataBytes ) );
        hessian2Input.startMessage();
        Object o = hessian2Input.readObject();
        hessian2Input.completeMessage();
        hessian2Input.close();

        System.out.println(o.getClass().getName());
    }
}

此代码的输出为:

java.lang.String

我假设它与原语的独立于语言的序列化有关,但它相当烦人。我正在编写JMS驱动程序,需要区分char和String,因为规范要求不同的行为。我正在考虑编写自己的类来表示char(并给予自动拳击),但我想知道是否有一个适当的方法,让海森对待一个字符作为一个字符之前,我开始通过这种扭曲。

trnvg8h3

trnvg8h31#

默认的Hessian序列化器将字符(char原语或对象)转换为字符串,请参阅此处的源代码:
https://github.com/ebourg/hessian/blob/git-svn/src/com/caucho/hessian/io/BasicSerializer.java#L144
要解决这个问题,你要么编写自己的Hessian序列化器,要么使用 Package 器对象:

class CharacterWrapper implements Serializable {
    public Character character;
}

CharacterWrapper cw = new CharacterWrapper();
cw.character = new Character('x');

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Hessian2Output hessian2Output = new Hessian2Output( byteArrayOutputStream );
hessian2Output.startMessage();
hessian2Output.writeObject(cw);
hessian2Output.completeMessage();
hessian2Output.close();

相关问题