2011-05-18 49 views
3

我该如何分解一个对象---一个Parcelable更具体;实际上它是一个捆绑包,但重点是相同的---成一个字节[]?我认为我这样做的方式是一个很好的解决方案,但显然我错了。如何将对象分解为字节[]?

只是为了参考这里是我这样做的旧方式。

public static byte[] getBytes(Object obj) throws java.io.IOException { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos  = new ObjectOutputStream(bos); 
    oos.writeObject(obj); 
    oos.flush(); 
    oos.close(); 
    bos.close(); 
    byte[] data = bos.toByteArray(); 
    return data; 
} 

感谢〜Aedon

编辑1 ::

打破这样的对象传递一个束它会导致NotSerializableException。

+0

这就是做对了,请问是什么问题?无论如何,在大多数情况下,序列化对象实际上是更好的解决方法。 – eLobato 2011-05-18 23:50:22

+0

你的对象是否实现了Serializable?这可能是关键 – eLobato 2011-05-18 23:59:41

+0

@eLobato我不确定Bundle是否可序列化。不过,我这么认为。 – AedonEtLIRA 2011-05-19 14:40:34

回答

4

你的代码看起来基本没问题。我会建议如下:

public static byte[] getBytes(Serializable obj) throws IOException { 
    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos  = new ObjectOutputStream(bos); 
    oos.writeObject(obj); 

    byte[] data = bos.toByteArray(); 

    oos.close(); 
    return data; 
} 
+0

这绝对是正确的做法。 @Aedon - 你可能想了解一些关于序列化和反序列化对象的知识,看看你是否会陷入任何陷阱(静态属性等) – Eric 2011-05-18 23:56:11

+0

哈!谢谢,我甚至从来没有注意到在我去拜特亚雷之前我正在关闭。我会看看是否有帮助。谢谢。 – AedonEtLIRA 2011-05-19 14:41:39

+0

不,我得到一个NotSerializableException。 Prolly应该在这个问题上加上我的坏处。更新。 – AedonEtLIRA 2011-05-19 14:57:36

1

该问题提到了Parcelable,它并不总是可序列化的。 我认为正确的做法是将Parcelable写入Parcel。 然后使用Parcel的marshall()方法写出原始字节。

我玩了一下。如果您的Parcelable遵循协议,则以下代码为Parcelable写出正确的字节数组。假设MyParcelable包含2个字符串和一个int。

  Parcel parcel1 = Parcel.obtain(); 
      MyParcelable parcelable1 = new MyParcelable("a", "b", 25); 
      parcelable1.writeToParcel(parcel1, 0); 

      byte content[] = parcel1.marshall(); 
      parcel1.recycle(); 
      Parcel parcel2 = Parcel.obtain(); 
      parcel2.unmarshall(content, 0, content.length); 
      parcel2.setDataPosition(0); 
      MyParcelable parcelable2 = MyParcelable.CREATOR.createFromParcel(parcel2); 
      parcel2.recycle(); 
      Toast.makeText(context, parcelable2.a + " " + parcelable2.b + " " + parcelable2.val, Toast.LENGTH_LONG).show(); 

另见How to use Parcel in Android?

+0

@Alex Gitelman能否提供您正在讨论的文档的链接,我想进一步阅读。更具体地写入光盘有什么危害。 – schwiz 2011-05-19 02:30:20

+0

@schwiz http://developer.android.com/reference/android/os/Parcel.html#marshall%28%29表明这种机制是为IPC设计的,并且不保证跨平台兼容。例如,我认为应该可以在本地进行短期存储,但不适用于网络通信。无论如何,我删除了我的FileOutputStream代码以防止混淆。 – 2011-05-19 03:07:24

+0

@Alex Gitelman,我刚刚阅读了马歇尔的文档。它说我不应该在持久存储上使用buye数据。任何想法为什么?我需要将数据存储在数据库中。 – AedonEtLIRA 2011-05-19 15:07:45

相关问题