我有一个Java程序,需要输出一个字节数组来表示类示例的原始字段。ObjectI/OStreams不适合,因为我只需要原始数据,因为这是数据必须通过网络收发的方式。如果不简单地编写一个手动转换每个字段的方法,我怎么能做到这一点呢?(有几百个,这些可能会改变)
monwx1rj1#
用Jackson数据绑定对象Map器将对象序列化为json(一个字符串),对得到的字符串执行.getBytes()操作,得到byte[]。
.getBytes()
byte[]
4nkexdtk2#
出现了几个问题:
我真的建议您使用类似Google Protocol Buffers或Apache Avro的东西。两者都有不同的方法,而且有更多的替代方案。Protocol Buffers定义数据结构并为其编译代码(在通信的“双方”),Avro发送带有数据的模式,并可以“动态”写入和读取数据。如果这不可能,您看过java.io.DataOutputStream吗?也许您还可以使用java.nio包中的内容,如ByteBuffer、CharBuffer、DoubleBuffer等,这样做的好处是java.nio还提供了适合这些缓冲区的异步网络操作。如果没有其他方法可以帮助你,你必须使用Java Reflection,用Class.getFields()和Field.getByte(Object)以及java.reflect中的其他类似方法读取对象的字段,但是这是一个非常丑陋的解决方案,你可能也要为此在性能和可维护性方面付出代价。
java.nio
ByteBuffer
CharBuffer
DoubleBuffer
Class.getFields()
Field.getByte(Object)
java.reflect
2条答案
按热度按时间monwx1rj1#
用Jackson数据绑定对象Map器将对象序列化为json(一个字符串),对得到的字符串执行
.getBytes()
操作,得到byte[]
。4nkexdtk2#
出现了几个问题:
我真的建议您使用类似Google Protocol Buffers或Apache Avro的东西。两者都有不同的方法,而且有更多的替代方案。Protocol Buffers定义数据结构并为其编译代码(在通信的“双方”),Avro发送带有数据的模式,并可以“动态”写入和读取数据。
如果这不可能,您看过java.io.DataOutputStream吗?
也许您还可以使用
java.nio
包中的内容,如ByteBuffer
、CharBuffer
、DoubleBuffer
等,这样做的好处是java.nio
还提供了适合这些缓冲区的异步网络操作。如果没有其他方法可以帮助你,你必须使用Java Reflection,用
Class.getFields()
和Field.getByte(Object)
以及java.reflect
中的其他类似方法读取对象的字段,但是这是一个非常丑陋的解决方案,你可能也要为此在性能和可维护性方面付出代价。