首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在另一个设备中解组捆绑包parsel

在另一个设备中解组捆绑包parsel
EN

Stack Overflow用户
提问于 2016-09-15 02:25:15
回答 2查看 28关注 0票数 0

我必须把一些信息放到捆绑包中。然后我使用parsel并保存到blob中的SQlite

代码语言:javascript
复制
ByteArrayOutputStream valueStream = new ByteArrayOutputStream();
        try {
            ContentValues rows = new ContentValues();
            rows.put("name", name);
            Parcel p = Parcel.obtain();



            bundle.writeToParcel(p, 0);

            valueStream.write(p.marshall());
            rows.put("bundle", valueStream.toByteArray());

            db.insert("tableName", null, rows);

            valueStream.close();
        } catch (IOException e) {
            Log.e("error writing object", e.toString());
        }

然后在另一个活动中,我正在阅读捆绑包:

代码语言:javascript
复制
 byte[] byteArray  = cursor.getBlob(cursor.getColumnIndex(Base.BUNDLE));


    Parcel parcel =  Parcel.obtain();
    parcel.unmarshall(byteArray, 0, byteArray.length);
    parcel.setDataPosition(0);
    Bundle bundle = Bundle.CREATOR.createFromParcel(parcel);

    desc.setText(bundle.getCharSequence("key")); 

在同一设备中,操作运行良好,但如果我将一个db文件带到另一个设备上,我将在读取代码时出错:

代码语言:javascript
复制
  desc.setText(bundle.getCharSequence("key")); 

在偏移量12处解组未知类型代码7340147

有没有人能告诉我这件事?

EN

回答 2

Stack Overflow用户

发布于 2016-09-15 02:45:36

Parcel类使用各种native方法来操作数据,在本例中用于存储。native基本上是指使用c/c++,它在本例中依赖于平台和体系结构,并且没有优化为各种平台提供存储结构,但它优化了在本地硬件上有效地存储数据,在本例中是您当前的设备。link to docs

因此,您的包裹存储数据可能会在其他设备上工作,也可能不会在其他设备上工作,因此如果您希望保持一致性,那么备选方案是Serializable接口或Json对象。

票数 1
EN

Stack Overflow用户

发布于 2016-09-15 02:33:10

然后我将其打包并保存到

中的SQlite中。

这不太可能在一台设备上工作,更不用说在多台设备上工作了。

引用the documentation for Parcel,并增加了重点:

包不是一种通用的序列化机制。该类(以及相应的用于将任意对象放入Parcel的Parcelable API )被设计为高性能的IPC传输。因此,将任何地块数据放入永久存储中是不合适的:更改地块中任何数据的底层实现可能会使较旧的数据不可读。

使用一些其他序列化机制,一种您可以控制并可以确保跨多个设备和操作系统版本工作的机制: JSON、XML、protobuf等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39497222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档