< prev index next > src/java.base/share/classes/java/io/ObjectStreamField.java
Print this page
/*
! * Copyright (c) 1996, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
/*
! * Copyright (c) 1996, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
private final boolean unshared;
/** corresponding reflective field object, if any */
private final Field field;
/** offset of field value in enclosing field group */
private int offset;
+ /** index of the field in the class, retain the declaration order of serializable fields */
+ private final int argIndex;
/**
* Create a Serializable field with the specified type. This field should
* be documented with a {@code serialField} tag.
*
* as writeObject/readObject; if true, write/read in the same
* manner as writeUnshared/readUnshared
* @since 1.4
*/
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;
}
/**
* Creates an ObjectStreamField representing a field with the given name,
* signature and unshared setting.
*/
! 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;
type = switch (signature.charAt(0)) {
case 'Z' -> Boolean.TYPE;
case 'B' -> Byte.TYPE;
case 'C' -> Character.TYPE;
* as writeObject/readObject; if true, write/read in the same
* manner as writeUnshared/readUnshared
* @since 1.4
*/
public ObjectStreamField(String name, Class<?> type, boolean unshared) {
+ this(name, type, unshared, -1);
+ }
+
+ /* package-private */
+ ObjectStreamField(String name, Class<?> type, boolean unshared, int argIndex) {
if (name == null) {
throw new NullPointerException();
}
this.name = name;
this.type = type;
this.unshared = unshared;
this.field = null;
this.signature = null;
+ this.argIndex = argIndex;
}
/**
* Creates an ObjectStreamField representing a field with the given name,
* signature and unshared setting.
*/
! ObjectStreamField(String name, String signature, boolean unshared, int argIndex) {
if (name == null) {
throw new NullPointerException();
}
this.name = name;
this.signature = signature.intern();
this.unshared = unshared;
this.field = null;
+ this.argIndex = argIndex;
type = switch (signature.charAt(0)) {
case 'Z' -> Boolean.TYPE;
case 'B' -> Byte.TYPE;
case 'C' -> Character.TYPE;
* earlier serialization implementations, a "showType" parameter is
* necessary to govern whether or not a getType() call on this
* ObjectStreamField (if non-primitive) will return Object.class (as
* opposed to a more specific reference type).
*/
! ObjectStreamField(Field field, boolean unshared, boolean showType) {
this.field = field;
this.unshared = unshared;
name = field.getName();
Class<?> ftype = field.getType();
type = (showType || ftype.isPrimitive()) ? ftype : Object.class;
signature = ftype.descriptorString().intern();
}
/**
* Get the name of this field.
*
* earlier serialization implementations, a "showType" parameter is
* necessary to govern whether or not a getType() call on this
* ObjectStreamField (if non-primitive) will return Object.class (as
* opposed to a more specific reference type).
*/
! ObjectStreamField(Field field, boolean unshared, boolean showType, int argIndex) {
this.field = field;
this.unshared = unshared;
name = field.getName();
Class<?> ftype = field.getType();
type = (showType || ftype.isPrimitive()) ? ftype : Object.class;
signature = ftype.descriptorString().intern();
+ this.argIndex = argIndex;
}
/**
* Get the name of this field.
*
// REMIND: deprecate?
protected void setOffset(int offset) {
this.offset = offset;
}
+ /**
+ * {@return Index of the field in the sequence of Serializable fields}
+ */
+ int getArgIndex() {
+ return argIndex;
+ }
+
/**
* Return true if this field has a primitive type.
*
* @return true if and only if this field corresponds to a primitive type
*/
< prev index next >