Java 如何序列化库中的对象?

Java 如何序列化库中的对象?,java,android,object,serialization,Java,Android,Object,Serialization,我正在开发一个Android应用程序,出于某种原因需要将一些对象存储到磁盘上(使用onSaveInstanceState()方法),然后使用序列化/打包再次检索它们(使用onRestoreInstanceState()方法) 正如您可能知道的,要使类成为可打包的,您需要使用库或编写一些样板代码 我的问题是,我有一些对象没有编写它们的类。它们是第三方或Android Sdk相关类。为清楚起见,以下是我的代码: private FragNavController mNavController; pr

我正在开发一个Android应用程序,出于某种原因需要将一些对象存储到磁盘上(使用
onSaveInstanceState()
方法),然后使用序列化/打包再次检索它们(使用
onRestoreInstanceState()
方法)

正如您可能知道的,要使类成为可打包的,您需要使用库或编写一些样板代码

我的问题是,我有一些对象没有编写它们的类。它们是第三方或Android Sdk相关类。为清楚起见,以下是我的代码:

private FragNavController mNavController;
private MenuItem mMenuItem;
private SharedPreferences mPrefs;

@Override
public void onCreate(Bundle savedInstanceState) {
    LayoutInflaterCompat.setFactory(getLayoutInflater(), new IconicsLayoutInflater(getDelegate()));
    setDefaultLanguage(Locale.ENGLISH.toString());
    //Paper.init(getApplicationContext());

    mPrefs = getPreferences(MODE_PRIVATE);
    super.onCreate(savedInstanceState);
    .
    .
    .
}
我使用库、、,但在所有库中,我都无法保存一些对象,如
mNavController
mMenuItem

以前是否有人遇到过这个问题,并且知道保存这些对象的最佳解决方案?

答案是:不要这样做

对象的序列化总是一件棘手的事情。您必须关注版本控制;确保升级应用程序不会中断对以前序列化对象的访问

这对你自己的东西来说已经够难了。但是您打算序列化您一无所知的对象。因此,第三方对其类所做的任何更改都可能直接影响您的应用程序。您最不希望发生的事情是,客户设备上与您的产品无关的某些更新会使您的产品崩溃;因为之前序列化的对象突然无法再反序列化了

长话短说:通过“简单地”保存应用程序正在使用的所有对象,小心地保存应用程序的状态。一种更为稳健的方法是后退一步,确定设计中的“数据元素”;并确保您可以将该数据存储为数据;与存储对象不同,这些对象包含您的数据;但可能还有很多你真的不在乎的事情。但您仍然不得不考虑这些其他事情,因为您也必须(反)序列化它们

换句话说:A)首先应该隔离需要持久化的数据;当你得到B)时,你会寻找好的方法来保存这些信息。如果您使用自己的数据库或共享首选项。。。可能取决于您的要求。

答案是:不要这样做

对象的序列化总是一件棘手的事情。您必须关注版本控制;确保升级应用程序不会中断对以前序列化对象的访问

这对你自己的东西来说已经够难了。但是您打算序列化您一无所知的对象。因此,第三方对其类所做的任何更改都可能直接影响您的应用程序。您最不希望发生的事情是,客户设备上与您的产品无关的某些更新会使您的产品崩溃;因为之前序列化的对象突然无法再反序列化了

长话短说:通过“简单地”保存应用程序正在使用的所有对象,小心地保存应用程序的状态。一种更为稳健的方法是后退一步,确定设计中的“数据元素”;并确保您可以将该数据存储为数据;与存储对象不同,这些对象包含您的数据;但可能还有很多你真的不在乎的事情。但您仍然不得不考虑这些其他事情,因为您也必须(反)序列化它们


换句话说:A)首先应该隔离需要持久化的数据;当你得到B)时,你会寻找好的方法来保存这些信息。如果您使用自己的数据库或共享首选项。。。可能取决于您的要求。

您在包裹商文档中看到了吗

没有Java源代码的类


对于相应Java源代码不可用的类,可以 使用@ParcelClass注释将类作为地块包含。 此注释可以在编译源中的任何位置声明 这很方便。例如,可以包括@ParcelClass 使用Android应用程序:

可以使用@ParcelClass注释声明多个@ParcelClass注释

此外,还可以配置@ParcelClass引用的类 使用@Parcel注释。这允许序列化 通过@Parcel上可用的任何参数进行配置 注释,包括要创建的序列化技术或类 分析

一种有用的技术是能够定义全局自定义转换器 对于类型:

这允许对类进行细粒度控制 不能直接修改


所以我认为您需要这样做,并编写一个自定义转换器。

您在Parceler文档中看到了吗

没有Java源代码的类


对于相应Java源代码不可用的类,可以 使用@ParcelClass注释将类作为地块包含。 此注释可以在编译源中的任何位置声明 这很方便。例如,可以包括@ParcelClass 使用Android应用程序:

可以使用@ParcelClass注释声明多个@ParcelClass注释

此外,还可以配置@ParcelClass引用的类 使用@Parcel注释。这允许序列化 通过@Parcel上可用的任何参数进行配置 注释,包括要创建的序列化技术或类 分析

一种有用的技术是能够定义全局自定义转换器 对于类型:

这允许对类进行细粒度控制 不能直接修改

因此,我认为您需要这样做,并编写一个自定义转换器。

非常感谢
 @ParcelClass(LibraryParcel.class) public class AndroidApplication
 extends Application{
     //... } 
 @ParcelClass(
     value = LibraryParcel.class,
     annotation = @Parcel(converter = LibraryParcelConverter.class)) class SomeClass{}