Java 特殊符号序列化

Java Special Symbol Serialization

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

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 值表示的,但是 ch 是如何使用 -62 -128

表示的

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

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

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

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

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