在java中将任何对象转换为字节数组

Har*_*ari 48 java serialization bytearray

我有一个X类型的对象,我希望在将它发送到S3存储之前将其转换为字节数组.谁能告诉我怎么做?我感谢您的帮助.

Hen*_*son 102

你想做的是" 序列化 ".有几种方法可以做到这一点,但如果你不需要任何花哨的东西,我认为使用标准的Java对象序列化就可以了.

也许你可以使用这样的东西?

package com.example;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Serializer {

    public static byte[] serialize(Object obj) throws IOException {
        try(ByteArrayOutputStream b = new ByteArrayOutputStream()){
            try(ObjectOutputStream o = new ObjectOutputStream(b)){
                o.writeObject(obj);
            }
            return b.toByteArray();
        }
    }

    public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException {
        try(ByteArrayInputStream b = new ByteArrayInputStream(bytes)){
            try(ObjectInputStream o = new ObjectInputStream(b)){
                return o.readObject();
            }
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

可以做到这一点有几个改进.至少你不能每个字节数组读/写一个对象,这可能是也可能不是你想要的.

请注意"只有支持该java.io.Serializable接口的对象才能写入流"(请参阅​​参考资料java.io.ObjectOutputStream).

既然你可能碰到它,那么连续分配和调整大小java.io.ByteArrayOutputStream可能会成为瓶颈.根据您的线程模型,您可能需要考虑重用某些对象.

对于没有实现Serializable接口的对象的序列化,您需要编写自己的序列化程序,例如使用read*/write*方法java.io.DataOutputStream和get*/put*方法,java.nio.ByteBuffer或者与反射一起使用,或者引入第三方依赖.

该站点具有一些序列化框架的列表和性能比较.看看API,似乎Kryo可能适合您的需求.


SAN*_*NN3 6

来自commons-lang的用法serializedeserialize方法.SerializationUtils


Pau*_*sik 4

是的。只需使用二进制序列化即可。您必须使用每个对象implements Serializable,但从那里开始就很简单了。

如果您想避免实现 Serialized 接口,您的另一种选择是使用反射并使用下面的过程从缓冲区读取和写入数据:

/** 
 * Sets all int fields in an object to 0.
 *
 * @param obj The object to operate on.
 *
 * @throws RuntimeException If there is a reflection problem.
 */
 public static void initPublicIntFields(final Object obj) {
    try {
       Field[] fields = obj.getClass().getFields();
       for (int idx = 0; idx < fields.length; idx++) {
          if (fields[idx].getType() == int.class) {
              fields[idx].setInt(obj, 0);
          }
       }
    } catch (final IllegalAccessException ex) {
       throw new RuntimeException(ex);
    }
 }
Run Code Online (Sandbox Code Playgroud)

来源

  • @cacho 链接已修复;) (2认同)