Android源码分析记录 StringBuffer.java:GetFields/PutFields学习

StringBuffer.java中,序列化的方法值得学习:


    private synchronized void writeObject(ObjectOutputStream out)
            throws IOException {
        ObjectOutputStream.PutField fields = out.putFields();
        fields.put("count", length());
        fields.put("shared", false);
        fields.put("value", getValue());
        out.writeFields();
    }

    private void readObject(ObjectInputStream in) throws IOException,
            ClassNotFoundException {
        ObjectInputStream.GetField fields = in.readFields();
        int count = fields.get("count", 0);
        char[] value = (char[]) fields.get("value", null);
        set(value, count);
    }

一般的序列化方法都是通过OjbectOuputStream的writeInt/writeObject等方法来序列化,然后对应的readInt/readObject等方法来反序列化。序列化和反序列化的时候,读写操作顺序必须一致。

这里的PutField/GetField提供了一种key/value的形式来写入/读出对应的字段的方法。这样写入读出的时候,就可以不必完全一样的顺序。


此外:对比StringBuffer.java和StringBuilder.java的代码可以看到,StringBuffer去掉所有的synchronized关键字就是StringBuilder了,一个是线程安全的,一个是非线程安全的类。对比代码一目了然。

;