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)
很显然,因为id是transient 它未发送到输出流.
我的问题是,这个零是默认值int?
我们没有保存状态,所以它给出了输出0,但它也是一个值.不应该null吗?
是的,类的成员变量在它们生成时(当它们在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)
它不能为null,因为int它是原始类型.相反,它接收类型的默认值,即0.它始终是任何类型的"自然0" - null对于引用类型,0表示数字类型,U + 0000表示char和falsefor表示boolean.有关更多详细信息,请参见Java语言规范的4.12.5节.
请注意,如果您只是声明一个实例/静态变量并在写入之前读取它,那么这也是您获得的默认值.
如果你想允许id为null,你需要把它变成一个Integer而不是一个int.