我想通过一个低开销的套接字传输一个Android对象。我应该使用标准的java.io.Serializable还是android.os.Parcel?
谢谢!
发布于 2014-01-22 08:10:49
如果您的消息更长、更复杂或需要更高的效率,我建议您尝试使用Google协议缓冲区。它们将允许进行一些合理的更改,例如添加新字段、删除以前的可选字段或添加一个全新的结构作为字段。但是,您也将使用真正的setter和getter类(可以是不可变的版本或可变的构建器,您喜欢怎样)。严格控制你所放的东西并不像看上去那么糟糕。
考虑一下XML,但是更小、更快、更简单
序列化对象的主要缺点是而不是,您以后不能更改协议细节。不同的是,如果引入版本号,并且如果希望遗留客户端查找该属性,则不能在JSON中重命名属性名,则可以执行许多兼容的更改。
但是序列化对象是特定于Java的,并且您不能拥有更高效的C++服务器客户端,或者使用,例如,如果您以后决定的话。协议缓冲区是语言中立的。
发布于 2014-01-22 07:58:01
都不是。
包裹是为IPC设计的,其他用途可以说是高效、危险的。文件上说
包不是一个通用的序列化机制.这个类(以及相应的用于将任意对象放置到一个包中的Parcelable )被设计为一个高性能的IPC传输。因此,将任何Parcel数据放置到持久存储中是不合适的:对包中任何数据的底层实现的更改可能会使旧数据不可读。
这也意味着您需要确保远程端拥有完全相同版本的Android和代码,以确保它能够正常工作。
Serializable也有类似的问题,在(android)综述中甚至有一个解决方案的提示:
警告:这个接口限制了它的实现类将来如何改变。通过实现Serializable,您可以将灵活的内存中实现细节公开为严格的二进制表示形式。简单的代码更改--比如重命名私有字段--在已更改的类可序列化时是不安全的。 ..。 推荐的替代方案: JSON简洁、可读性强、效率高.Android包括一个流API和一个用于读写JSON的树API。使用像GSON这样的绑定库直接读写Java对象。
如果您想将数据从一个设备移动到另一个设备,我认为最好为数据创建一个协议,将其传送过来,并使用该数据填充远程对象。JSON可能是个很好的起点。
祝好运!
发布于 2014-01-22 07:51:54
通过套接字传输对象在很大程度上取决于接收对象的内容。通常,这种传输依赖于基于文本的序列化,比如XML或JSON。
https://stackoverflow.com/questions/21277015
复制相似问题