定义
代表可被序列化的字段。即指定哪些字段将参与序列化,并封装这些参与序列化的字段信息。所有可被序列化的字段需要封装为一个ObjectStreamField数组,且数组变量名必须为serialPersistentFields。
public class ObjectStreamField implements Comparable<Object> {...}
- 实现 Comparable 接口,可比较大小
重写两个方法toString和compareTo
@Overridepublic int compareTo(Object obj) {// 强转为ObjectStreamFieldObjectStreamField 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.*/@Overridepublic 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()方法
// 返回字段的类型@CallerSensitivepublic Class<?> getType() {// 获得控制台安全管理器if(System.getSecurityManager() != null) {// 获得调用映像Class<?> caller = Reflection.getCallerClass();// 判定两个类型的ClassLoader是否相等或者为祖先关系(caller为type的祖先)if(ReflectUtil.needsPackageAccessCheck(caller.getClassLoader(), type.getClassLoader())) {// 如果该类型调用不可访问的包则抛出SecurityExceptionReflectUtil.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()方法
// 返回字段签名,对于基本类型,返回nullpublic 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;}
