【问题标题】:Restoring state with certain fields marked as transient使用标记为瞬态的某些字段恢复状态
【发布时间】:2015-02-06 03:26:31
【问题描述】:

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

所以,有些字段无法恢复,需要重新初始化。

示例:

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);
}

这个问题有什么好的解决方案?

【问题讨论】:

    标签: java android serialization constructor transient


    【解决方案1】:

    如果您有一个临时字段列表,您可以使用这些字段的列表和一个 Paint 对象创建您自己的代理类。例如 proxy.setAntiAlias(true) 会将代理的字段 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);
    }
    

    当你想保存画图的配置时,你可以序列化对象代理并使用代理对象恢复画图的配置。

    【讨论】:

      猜你喜欢
      • 2017-11-29
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2010-10-28
      • 2011-07-07
      • 1970-01-01
      相关资源
      最近更新 更多