定义
代表可被序列化的字段。即指定哪些字段将参与序列化,并封装这些参与序列化的字段信息。所有可被序列化的字段需要封装为一个ObjectStreamField数组,且数组变量名必须为serialPersistentFields。
public class ObjectStreamField implements Comparable<Object> {
...
}
- 实现 Comparable 接口,可比较大小
重写两个方法toString和compareTo
@Override
public int compareTo(Object obj) {
// 强转为ObjectStreamField
ObjectStreamField other = (ObjectStreamField) obj;
// 当前字段是否为基本类型
boolean isPrim = isPrimitive();
// 两个字段类型不相同的场合
if(isPrim != other.isPrimitive()) {
// 基本类型倒序,非基本类型正序
return isPrim ? -1 : 1;
}
// 调用string的比较方法
return name.compareTo(other.name);
}
/**
* Return a string that describes this field.
*/
@Override
public String toString() {
// 返回字段签名和字段名称
return getSignature() + ' ' + name;
}
成员变量
// 字段名称
private final String name;
// 封装的字段(可能为null)
private final Field field;
// 字段类型
private final Class<?> type;
// 字段类型的JVM规范签名
private final String signature;
// JVM规范签名(懒加载生成)
private String typeSignature;
// 字段是否非共享(共享字段会共用一段序列化信息)
private final boolean unshared;
// 当前字段在所有待序列化字段中的偏移量(以字节为偏移单位)
private int offset;
构造函数
构造函数(传入字段名和字段数据类型,默认可共享)
// 构造函数(传入字段名和字段数据类型,默认可共享)
public ObjectStreamField(String name, Class<?> type) {
this(name, type, false);
}
// 构造函数(传入数据名、数据类型、共享权限)
public ObjectStreamField(String name, Class<?> type, boolean unshared) {
if(name == null) {
throw new NullPointerException();
}
this.name = name;
this.type = type;
this.unshared = unshared;
// 字段、签名初始化
this.field = null;
this.signature = null;
}
构造函数(传入数据名、签名、共享权限)
// 构造函数(传入数据名、签名、共享权限)
ObjectStreamField(String name, String signature, boolean unshared) {
if(name == null) {
throw new NullPointerException();
}
this.name = name;
// 返回字符串的规范形式
this.signature = signature.intern();
this.unshared = unshared;
this.field = null;
// 根据类型签名获得数据类型
switch(signature.charAt(0)) {
case 'Z':
type = Boolean.TYPE;
break;
case 'B':
type = Byte.TYPE;
break;
case 'C':
type = Character.TYPE;
break;
case 'S':
type = Short.TYPE;
break;
case 'I':
type = Integer.TYPE;
break;
case 'J':
type = Long.TYPE;
break;
case 'F':
type = Float.TYPE;
break;
case 'D':
type = Double.TYPE;
break;
case 'L':
case '[':
type = Object.class;
break;
default:
throw new IllegalArgumentException("illegal signature");
}
}
构造函数(给予映射的字段,是否共享控制,是否显示实际类型))
ObjectStreamField(Field field, boolean unshared, boolean showType) {
this.field = field;
this.unshared = unshared;
name = field.getName();
// 获取字段类型
Class<?> ftype = field.getType();
// 显示类型为true的场合,返回字段类型,否则返回Object类型
type = (showType || ftype.isPrimitive()) ? ftype : Object.class;
// 获取类型对应的签名
signature = getClassSignature(ftype).intern();
}
内部方法
getField()方法
// 获取允许反序列化的字段
Field getField() {
return field;
}
getName()方法
// 返回字段的名称
public String getName() {
return name;
}
getType()方法
// 返回字段的类型
@CallerSensitive
public Class<?> getType() {
// 获得控制台安全管理器
if(System.getSecurityManager() != null) {
// 获得调用映像
Class<?> caller = Reflection.getCallerClass();
// 判定两个类型的ClassLoader是否相等或者为祖先关系(caller为type的祖先)
if(ReflectUtil.needsPackageAccessCheck(caller.getClassLoader(), type.getClassLoader())) {
// 如果该类型调用不可访问的包则抛出SecurityException
ReflectUtil.checkPackageAccess(type);
}
}
return type;
}
getSignature()方法
// 返回字段签名
String getSignature() {
if(signature != null) {
return signature;
}
String sig = typeSignature;
// This lazy calculation is safe since signature can be null iff one
// of the public constructors are used, in which case type is always
// initialized to the exact type we want the signature to represent.
if(sig == null) {
// 获取类型对应的签名
typeSignature = sig = getClassSignature(type).intern();
}
return sig;
}
// 获取类型对应的签名
static String getClassSignature(Class<?> cl) {
// 基本类型的场合
if(cl.isPrimitive()) {
return getPrimitiveSignature(cl);
} else {
// 非基本类型的场合
return appendClassSignature(new StringBuilder(), cl).toString();
}
}
// 拼接类型签名
static StringBuilder appendClassSignature(StringBuilder sbuf, Class<?> cl) {
// 获取数组类型
while(cl.isArray()) {
sbuf.append('[');
cl = cl.getComponentType();
}
// 基本类型
if(cl.isPrimitive()) {
sbuf.append(getPrimitiveSignature(cl));
} else {
// 对象类型
sbuf.append('L').append(cl.getName().replace('.', '/')).append(';');
}
return sbuf;
}
// 基本类型的签名
private static String getPrimitiveSignature(Class<?> cl) {
if(cl == Integer.TYPE) {
return "I";
} else if(cl == Byte.TYPE) {
return "B";
} else if(cl == Long.TYPE) {
return "J";
} else if(cl == Float.TYPE) {
return "F";
} else if(cl == Double.TYPE) {
return "D";
} else if(cl == Short.TYPE) {
return "S";
} else if(cl == Character.TYPE) {
return "C";
} else if(cl == Boolean.TYPE) {
return "Z";
} else if(cl == Void.TYPE) {
return "V";
} else {
throw new InternalError();
}
}
getTypeCode()方法
// 返回字段签名
public char getTypeCode() {
return getSignature().charAt(0);
}
getTypeString()方法
// 返回字段签名,对于基本类型,返回null
public String getTypeString() {
return isPrimitive() ? null : getSignature();
}
getOffset()方法
// 返回字段的偏移量
public int getOffset() {
return offset;
}
setOffset()方法
// 设置字段的偏移量
protected void setOffset(int offset) {
this.offset = offset;
}
isPrimitive()方法
// 当前字段是否为基本类型
public boolean isPrimitive() {
// 返回字段签名
char tcode = getTypeCode();
return ((tcode != 'L') && (tcode != '['));
}
isUnshared()方法
// 判断当前字段是否非共享
public boolean isUnshared() {
return unshared;
}