如何序列化库中的对象?

时间:2017-06-08 08:00:48

标签: java android object serialization

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

您可能知道,要将类设置为Parcelable,您需要使用Parceler库或编写一些样板代码。

我的问题是,我有一些不写他们班级的对象。它们是第三方或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);
    .
    .
    .
}

我使用Parceler库,XstreamicepickpaperGson and sharedPreferences Method,但在所有这些库中,我都无法保存像{ {1}}和mNavController

之前是否有人遇到此问题并知道保存这些对象的最佳解决方案?

2 个答案:

答案 0 :(得分:0)

非答案:这样做。

对象的序列化总是棘手的业务。你必须密切关注版本控制;确保升级您的应用不会破解访问以前序列化的对象。

对于自己的事情来说,这可能很难。但是您打算序列化您知道 nothing 的对象。因此,对第三方对其类所做的任何更改可能会直接影响您的应用。您要做的最后一件事是客户设备上与您的产品相关的的某些更新会导致您的产品崩溃;因为突然之前序列化的对象不能再反序列化了。

长话短说:谨慎通过“简单地”保存正在使用的所有对象来保留应用程序的状态。一种更强大的方法是退后一步,确定设计中的“数据元素”;并确保您可以将该数据存储为数据;而不是存储对象 - 作为那些对象,是包含您的数据;但可能还有很多其他你不关心的事情。但是你仍然被迫考虑其他这些事情,因为你也必须(de)序列化它们。

换句话说:A)首先应该隔离需要持久化的数据;当你得到那个B)时,你会研究如何坚持这些信息。如果您使用自己的数据库或共享首选项,......可能取决于您的要求。

答案 1 :(得分:0)

您是否在Parceler文档中看到了这一点?

  

没有Java源的类

           

对于没有相应Java源的类,可以使用   使用@ParcelClass批注将类包含为Parcel。   可以在编译源中的任何位置声明此注释   很方便。例如,可以包括@ParcelClass   使用Android应用程序:

 @ParcelClass(LibraryParcel.class) public class AndroidApplication
 extends Application{
     //... } 
  

可以使用@ParcelClasses批注声明多个@ParcelClass批注。

     

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

     

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

 @ParcelClass(
     value = LibraryParcel.class,
     annotation = @Parcel(converter = LibraryParcelConverter.class)) class SomeClass{} 
  

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

https://github.com/johncarl81/parceler#classes-without-java-source

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