Java 使用标记为瞬态的特定字段恢复状态

Java 使用标记为瞬态的特定字段恢复状态,java,android,serialization,constructor,transient,Java,Android,Serialization,Constructor,Transient,我有许多可序列化的对象要从文件中保存和恢复。问题是,许多对象包含临时字段,这些字段在构造函数中初始化,然后由同一类的方法使用 因此,某些字段无法恢复,但需要重新初始化 示例: private transient Paint myPaint; public MyClass() { myPaint = new Paint(); myPaint.setAntiAlias(true); myPaint.setColor(Color.GRAY); } public void R

我有许多可序列化的对象要从文件中保存和恢复。问题是,许多对象包含临时字段,这些字段在构造函数中初始化,然后由同一类的方法使用

因此,某些字段无法恢复,但需要重新初始化

示例:

private transient Paint myPaint;

public MyClass() {
    myPaint = new Paint();
    myPaint.setAntiAlias(true);
    myPaint.setColor(Color.GRAY);
}

public void Render(Canvas canvas) {
    canvas.drawText("Text: ", 0, 0, myPaint);
}

解决这个问题的好办法是什么

如果您有一个临时字段列表,您可以使用这些字段的列表和一个Paint对象创建自己的代理类。例如,proxy.setAntiAliastrue会将代理的字段antiAlias设置为true,并将该值传递给paint:

public class Proxy
    implements Serializable
{
    transient Paint paint;

    public Proxy(Paint paint)
    {
        this.paint = paint;
    }

    public Paint getPaint()
    {
        return paint;
    }

    public void setAntiAlias(boolean antiAlias)
    {
        this.antiAlias = antiAlias;
        getPaint().setAntiAlias(antiAlias);
    }

    public boolean getAntiAlias()
    {
        return antiAlias;
    }

    public void setColor(Color color)
    {
        this.color = color;
        getPaint().setColor(color);
    }

    public Color getColor()
    {
        return color;
    }
}
然后您的代码:

private transient Paint myPaint;

public MyClass(Proxy proxy) {
    myPaint = new Paint();
    myPaint.setAntiAlias(proxy.getAntiAlias());
    myPaint.setColor(proxy.getColor());
}

public void Render(Canvas canvas) {
    canvas.drawText("Text: ", 0, 0, myPaint);
}
如果要保存paint的配置,则可以序列化对象代理并使用代理对象还原paint的配置