【问题标题】: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);
}
当你想保存画图的配置时,你可以序列化对象代理并使用代理对象恢复画图的配置。