问:开发人员创建自己的序列化格式有多常见?具体地说,我使用java将对象作为一个巨大的字符串发送,其中包含用于分隔变量的标记。
我的逻辑:我选择这个是因为它很大程度上消除了语言依赖性(忽略了java修改后的UTF-8),而且如果你使用java的序列化,你也不会有对象版本问题,如果你使用java的序列化,接收端必须有完全相同的对象版本,所以运行在旧版本上的客户端将无法接收任何对象数据。代码并不太难看,读起来也不错,但我想我的问题是,这个实例的最佳实践是什么?这是一个个人项目。
其他已知的选择:好的,我只是在序列化一个对象以便通过网络发送它,并且遇到了googles协议缓冲区。序列化对象的标准化程度如何?我基本上遇到了三种方法来做到这一点。(我将在这里讨论java,因为这正是我这么做的目的) 1)使用java的本机序列化类2)使用您自己的方式序列化对象,可能使用字符串和标记3)使用Protocol Buffers或其他一些已知格式(JSON、XML等)
从我收集的信息来看,序列化基本上有3个主要目标: 1)速度/效率/大小2)语言独立性3)版本接受(在旧版本的代码仍然可以接受新版本的部分,反之亦然)
大多数大型软件项目都使用协议缓冲区吗?如果你的客户端是一个资源少得多的移动设备,它会发生变化吗?
发布于 2011-01-27 10:32:32
如果您使用标准格式(JSON、XML,甚至proto buffer),那么通过集成点扩展您的应用程序将有更多的机会。但如果只是在内部,那么就做简单的事情。就我个人而言,我创建了一个专用的持久代理类来表示给定对象的序列化形式。然后使用writeReplace和readResolve使用最有意义的方法序列化该对象(Java序列化用于无线实时传输,xml用于长期持久化)。随着类的发展,我可以创建全新的持久代理实现,向代理添加版本控制,等等……视情况而定。我相信Bloch在Effective中讨论了这个模式。
至于想出一个纯粹的从头开始的连线协议,这实际上取决于性能对应用程序的重要性。与大多数事情一样,您可以利用的标准库/协议越多,您就可以更快地发布新代码。当我看到大量涉及序列化/etc的代码时...我通常认为这是一种代码气味,并非常密切地关注它是否合理。只有我的0.02美元。
还有-有人发布了一个关于图形的问题……这实际上是我有意避免标准序列化的一个方面。Java序列化复杂图形的能力并不好--如果图形非常复杂,就会出现堆栈溢出问题(哈)。在这些情况下,持久代理非常非常重要。
发布于 2011-01-27 11:41:34
问题:开发人员创建自己的序列化格式有多常见?
假设你的意思是从头开始创建它,那么答案是“相当不常见”。
另外,我想说的是,一般来说,这并不是“最佳实践”。在大多数情况下,现有的常用替代方案(Java序列化、JSON、XML等)提供了一个很好的解决方案。
如果您有明确的需求,或者您有明确的证据表明现有的替代方案不起作用,那么您应该只考虑“滚动您自己的”格式(并实现相应的序列化/反序列化代码)。民间认为"XYZ很慢“并不是充分的证据。
发布于 2011-01-27 10:39:49
有几件事立即出现在我的脑海中:
正如您所看到的,这些步骤促进了服务器和可能的客户端之间的格式开放性和松散耦合。没有人知道你的客户将来会用到什么技术:想做一个iPhone客户端吗?HTML5+JS客户端?服务器也是如此:)
https://stackoverflow.com/questions/4812011
复制相似问题