Java 特殊符号序列化

问题描述

我想知道原始字符在java中是如何序列化的。我序列化了一个类来理解字节信息在java中是如何存储的。以下是我序列化的类。

public class Person implements Serializable{
    char ch = (char) 128;
    private String name = "abc" + ch;
    private int age = 11;

    public int getAge(){
        return age;
    }
    public void setAge(int age){
        this.age = age;
    }
}

当我把它转换成字节数组时,

的值

"abc" + ch

97 98 99 -62 -128

我想知道 -62 -128 是如何表示 ch 的。 "abc" 根据它们的 ASCII 值表示,但如何使用 -62 -128 表示 ch

解决方法

Java 字符串在默认序列化中采用 UTF-8 编码。

您可以查看 UTF-8 的完整规范汇总 on the Wikipedia page

请注意,0x00 和 0x7F 之间的字符按原样存储为一个字节,但字符 0x80 到 0x07FF 存储为两个字节的序列,110xxxxx 10xxxxxx,其中“x”表示用于值的连续 11 位在那个范围内。

您的 char 128 在该范围内,位序列为 00010000000。因此,相应的两字节 UTF-8 序列为 11000010 10000000,或者 -62、-128(如果您将它们解释为有符号的 8 位字符)。

(对于某些特殊字符,UTF-8 的 Java 版本实际上与 Wiki 上的略有不同,但不影响此字符串!)