java - 恢复某些字段标记为 transient 的状态

标签 java android serialization constructor transient

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

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

说明性示例:

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

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

关于java - 恢复某些字段标记为 transient 的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27358585/

相关文章:

java - 无法 stub android.os.Handler 类的发布方法

java - 使用一个空文件来拥有一个应用程序实例

android - 从矩阵获取坐标和宽度/高度

c# - 如何在 C# 中比较两个实例的内容?

java - 通过 ANT 与 Eclipse 创建 jar

java - 如何清空输入流?

android - 从 Android sqlite 数据库中检索大 blob

android - Kotlin如何初始化BluetoothDevice

c# - 序列化包含 List<T> 的 List<T>

c# - 使用 BinaryFormatter 序列化和反序列化对象图