0

我想知道如何通过同一程序的不同风格安全地使用序列化对象。像这样考虑两个 A 类和 B 类:

public class A implements Serializable
{
    private String myText = null;

    public A()
    {
        myText = B.text;
        B.myMethod();
    }  
}

在另一个文件中:

public class B
{
    /* EDITED */
    private static A myA = null;
    public static String text = "B1_text";

    public static void saveA()
    {
        myA = new A();
        /* blablabla */
        objectOutputStream.writeObject(myA);
        /* blablabla */
    }

    public static void loadA()
    {
        /* blablabla */
        myA = objectInputStream.readObject();
        /* blablabla */
    }

    public static void myMethod()
    {
        /* some stuff */
    }

    public static void not_A_related_method()
    {
        /* some stuff */
    }
}

现在我打开我的程序,打电话

B.saveA();

将 A 保存到文件中,然后关闭程序。如果我稍后从文件中加载 A,调用

B.loadA();

不会有什么不好的事情发生。

但是,如果我将 B 类(在将 A 类从未触及的 B 类保存到文件之后)更改为不同的东西,例如:

public class B
{
    /* EDITED */
    private static A myA = null;
    public static String text = "B2_COMPLETELY_DIFFERENT_TEXT";

    public static void saveA()
    {
        myA = new A();
        /* blablabla */
        objectOutputStream.writeObject(myA);
        /* blablabla */
    }

    public static void loadA()
    {
        /* blablabla */
        myA = objectInputStream.readObject();
        /* blablabla */
    }

    public static void myMethod()
    {
        /* some NEW stuff */
    }

    public static void not_A_related_method()
    {
        /* some NEW stuff */
    }

    public static void ANOTHER_not_A_related_method()
    {
        /* some stuff */
    }
}

然后我打电话

B.loadA(); //(loading a previously saved file)

真的会发生什么?

我经历过一切都很顺利,但是从序列化对象中改变静态引用的方法和字段还能走多远?

4

2 回答 2

0

但是,如果我将 B 类(在将 A 类从未触及的 B 类保存到文件之后)更改为不同的东西,例如:

反序列化不关心哪个特定方法序列化了对象。即使改变了这种方法。主要的是你不应该使类A不兼容,以便它可以被反序列化。

如果您想静态地 [反] 序列化对象,您可以考虑使用单例模式

您可以在桌面上序列化一个对象,然后在 Android 中反序列化它。您只需要关心类的兼容性。

它们可以不同(例如具有不同的方法),但要确保它们具有相同的 SerialVersionUID你可以在这里找到它是什么的一个很好的解释。

于 2013-08-19T13:36:05.357 回答
0

静态字段未序列化,因此两个版本都可以正常工作。旧的序列化文件可以在新版本的程序中读取,新文件可以在旧版本的程序中读取。

静态字符串不存储在序列化文件中。任何依赖该静态字符串作为某个值的逻辑仍然有效。

于 2013-08-19T13:39:16.153 回答