2012-05-04 61 views
0

我一直在寻找一个解决方案,为此一小会儿,而不是我发现相当匹配的东西。 C#有一个内置的序列化库,但这不是我所期望的。我需要序列化对象,以便可以将它们序列化,并将头数据附加到数据包即。 ID号,时间戳,对象类型等,然后能够发送出去,而不必记住我发送给它的平台。换句话说,我应该能够用C++或Java解开我的数据包,而不用比我投入的对象类型和头数据的顺序更多的知识。 C#中的二进制格式化程序会产生一个问题,因为它被设计为使用相同的库在另一端进行反序列化。它还会产生我不想处理的臃肿数据包。我宁愿格式化我的数据包。字节转换的确切对象,类似于C#中的memcpy

| ======== | ======== | ========= | === | ===== ========= |

| packetID |数据类型| timeStamp | etc | serializedObject |

| ======== | ======== | ========= | === | ============= = |

如果我有权访问memcpy的某些内容以实现此目的,那将会很好,因为只要对象的数据类型顺序被反序列化为匹配(是的,假设其他语言具有相同的字节大小的数据类型),很容易从一个新的平台上抓取来自服务器的数据(比如我想抓取Android(Java)或iPhone(obj。C)的数据),而且很少麻烦

+4

为什么不使用XML或JSON? – svick

+0

我对使用XML的理解是,它增加了大量的数据包膨胀。由于服务器充当中央集线器,在服务器执行其他任务时将大量数据包提供给大量设备可能会迅速产生大量拥塞。这是一个很好的解决方案,但是我会用一台很老的机器来运行它,所以即使是一些客户也可以为它做很多工作。 –

+1

你也可以使用BSON或protobuf-net ... –

回答

3

I'已经使用Google's protocol buffers效果很好。它体积小,速度快,跨平台,向后兼容,并且可以序列化为二进制格式。它不支持您正在查找的自定义标题信息,但如果您可以构建自己的数据包,则可以根据需要将自定义标题添加到二进制流中。 Protobuf可以编译成C#,iOS,Java和C++。

+0

我似乎找不到这个的C#变体。 “使用各种语言 - Java,C++或Python”。 –

+0

Jon Skeet在这里写下了它的一个端口:http://code.google.com/p/protobuf-csharp-port/和Marc Gravel在这里有一个版本http://code.google.com/p/protobuf- net/ –

+0

有没有办法获得对象的直接字节/二进制表示的方式,它被保存在RAM中?感谢您的链接!比特转换器应该做到这一点,但它添加了一堆垃圾。 –