【问题标题】:Best way to implement save and restore object attribute state实现保存和恢复对象属性状态的最佳方法
【发布时间】:2014-10-08 07:06:29
【问题描述】:

实现保存和恢复/推送和弹出对象属性状态的最佳方法是什么?像 glPushMatrix() 和 glPopMatrix() 一样?

例如:

obj.v1 = false;
obj.v2 = 0;
obj.v3 = "init";

obj.save();
obj.v1 = true;
obj.v2 = 2;
obj.v3 = "foo"
/* Do something... */

obj.restore();
/* Now v1 = false, v2 = 0, v3 = "init" again */

【问题讨论】:

    标签: java android serialization


    【解决方案1】:

    要保存到文件:使您的类可序列化

    package com.yourpackage.name;
    import java.io.Serializable;
    
    public class myClass implements Serializable {
        public enum counterType {
            count_down,
            count_up
        }
        public int myIntValue= 0;
    }
    

    如果您收到警告“可序列化类 X 未声明 long 类型的静态最终 serialVersionUID 字段”,您可以通过为 serialVersionUID 添加一个值来解决此问题,例如:

    private static final long serialVersionUID = 1234567890abcdefg;

    像往常一样声明你的变量(例如在你的主要活动中):

    myClass myClassVariable = new myClass();
    myClassVariable.myIntValue = 99;
    

    现在您可以使用以下方法将数据保存到文件中:

    try
    {
       FileOutputStream myFileOutputStream = new FileOutputStream(getFilesDir() + "file_name.ser");
       ObjectOutputStream myObjectOutputStream = new ObjectOutputStream(myFileOutputStream);
       myObjectOutputStream.writeObject(myClassVariable);
       myObjectOutputStream.close();
    }
    catch (Exception e)
    {
        Log.e("Error when saving to file.",Log.getStackTraceString(e)); 
    }
    

    再次加载您的数据:

    try
    {
        FileInputStream myFileInputStream = new FileInputStream(getFilesDir() + "file_name.ser");
        ObjectInputStream myObjectInputStream = new ObjectInputStream(myFileInputStream);
        readClassVariable = (myClass) myObjectInputStream.readObject(); 
        myObjectInputStream.close();
    }
    catch (Exception e)
    {
        Log.e("Error when loading from file.",Log.getStackTraceString(e));
    }
    

    readClassVariable 现在包含您保存的类,例如readClassVariable.myIntValue 等于 99

    希望对您有所帮助。欢迎评论:)

    附言我需要代表,所以如果您喜欢,请不要忘记接受答案!

    【讨论】:

    • 一定要输出到文件吗?可以全部在 RAM 中完成吗?
    • 是否可以使用 ByteArrayOutputStream 代替 FileOutputStream?
    【解决方案2】:

    保存到 RAM:

    您可以简单地将其复制到另一个类变量中。

    但是请注意,当您使用等号时,只会复制 REFERENCE(您仍在使用相同的变量):

    myClass1 = myClass2

    在这种情况下,最简单的方法是创建一个新类并为所有参数单独复制参数:

    myClass1.myIntValue = myClass2.myIntValue
    

    这样您将 value 而不是 reference 复制到(相同的)变量。

    【讨论】:

    • 序列化会有更好的性能还是空间友好?因为推送和弹出不是要制作一份备份副本。
    • 对于保存到文件是的,序列化是最有效的方法。如果您不想保存到文件,只需使用(本地)变量来临时。存储值...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2020-08-12
    相关资源
    最近更新 更多