Java Object Serialization Specification: C - Example of Serializable Fields


C.1 java.io.File的替代实现示例

本附录提供了一个简要示例,说明如何指定和实现一个现有类,以便与现有实现进行互操作,但不需要对文件名的表示(作为String)做出相同的假设。

系统类java.io.File表示文件名,并具有用于解析、操作文件和目录的名称的方法。它有一个包含当前文件名的私有字段。解析路径的方法的语义取决于当前路径分隔符,该分隔符保存在静态字段中。该路径分隔符是文件的序列化状态的一部分,因此在读取文件时可以调整文件名。

File对象的序列化状态定义为可序列化字段和文件的数据值序列。在这种情况下,每种类型各有一个。

可序列化字段:
    String path;     // 带有嵌入分隔符的路径名
可序列化数据:
    char            // 路径名分隔符

替代实现可能定义如下:

class File implements java.io.Serializable {
    ...
    private String[] pathcomponents;
    // 使用ObjectStreamClass定义可序列化字段

    /**
     * @serialField path String
     *              由分隔符分隔的路径组件。
     */

    private static final ObjectStreamField[] serialPersistentFields
        = { new ObjectStreamField("path", String.class) };
    ...
        /**
         * @serialData  默认字段,后跟分隔符字符。
         */

    private void writeObject(ObjectOutputStream s)
        throws IOException
    {
        ObjectOutputStream.PutField fields = s.putFields();
        StringBuffer str = new StringBuffer();
        for(int i = 0; i < pathcomponents; i++) {
            str.append(separator);
            str.append(pathcomponents[i]);
        }
        fields.put("path", str.toString());
        s.writeFields();
        s.writeChar(separatorChar); // 添加分隔符字符
    }
    ...

    private void readObject(ObjectInputStream s)
        throws IOException
    {
        ObjectInputStream.GetField fields = s.readFields();
        String path = (String)fields.get("path", null);
        ...
        char sep = s.readChar(); // 读取先前的分隔符字符

        // 使用分隔符将路径解析为组件,并存储到pathcomponents数组中。
    }
}