瞬态int的反序列化值?

Reu*_*ben 4 java serialization

public class Employee implements java.io.Serializable
{
 public String name;
 public int transient id;
}
Run Code Online (Sandbox Code Playgroud)

假设我们正在序列化......

Employee e = new Employee();
e.name="REUBEN";
e.id=94731;
Run Code Online (Sandbox Code Playgroud)

现在如果我反序列化那么

System.out.println("Name: " + e.name); will give the o/p REUBEN
System.out.println("ID: " + e.id); will give the o/p 0
Run Code Online (Sandbox Code Playgroud)

很显然,因为idtransient 它未发送到输出流.

我的问题是,这个零是默认值int
我们没有保存状态,所以它给出了输出0,但它也是一个值.不应该null吗?

San*_*rma 9

是的,类的成员变量在它们生成时(当它们在JVM中创建时)获得它们的默认值,因此为0,这是基元int类型的默认值.如果这是造成以"检验" ID是否穿过或不发的问题,只是使用Integer它会得到的默认值null(不,应该是任何混乱的来源,只是说).

public class Employee implements java.io.Serializable
{
 public String name;
 public transient Integer id;
}
System.out.println("Name: " + e.name); will give the o/p REUBEN
System.out.println("ID: " + e.id); will give the o/p null
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 7

它不能为null,因为int它是原始类型.相反,它接收类型的默认值,即0.它始终是任何类型的"自然0" - null对于引用类型,0表示数字类型,U + 0000表示charfalsefor表示boolean.有关更多详细信息,请参见Java语言规范的4.12.5节.

请注意,如果您只是声明一个实例/静态变量并在写入之前读取它,那么这也是您获得的默认值.

如果你想允许id为null,你需要把它变成一个Integer而不是一个int.