您需要定义一种格式。你有以下
byte[] avroBinaryValue = os.toByteArray();
String schemaName = "DEMOGRAPHIC";
long lastModifiedDate = 1379811105109L;
我猜avroBinaryValue
可以是可变长度的,所以也可以schemaName
。出于所有意图和目的,lastModifiedDate
适合很长一段时间,即。8 个字节。
如果你想序列化它(除了使用Serializable
),你必须使用一种特定的格式来告诉你正在阅读的内容以及何时停止阅读。例如
Offset Length (in bytes) Purpose
0 4 - length of avroBinaryValue array
4 X - avroBinaryValue array
4+X 4 - length of of schemaName byte array
4+X+4 Y - schemaName byte array
4+X+4+Y 8 - value of lastModifiedDate
还要决定是否需要大端或小端字节顺序。
因此,您按照格式中的描述编写三个字段,并以相同的方式阅读它。
这是一个在内存中完成的示例,其中os
a String
(为简单起见)
public static void main(String[] args) throws Exception {
String os = "whatever os is";
byte[] avroBinaryValue = os.getBytes();
String schemaName = "DEMOGRAPHIC";
long lastModifiedDate = 1379811105109L;
byte[] schemaNameBytes = schemaName.getBytes();
ByteArrayOutputStream byteOs = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(byteOs);
out.writeInt(avroBinaryValue.length);
out.write(avroBinaryValue);
out.writeInt(schemaNameBytes.length);
out.write(schemaNameBytes);
out.writeLong(lastModifiedDate);
// write done
byte[] allWrittenBytes = byteOs.toByteArray();
DataInputStream in = new DataInputStream(new ByteArrayInputStream(allWrittenBytes));
int sizeAvro = in.readInt();
avroBinaryValue = new byte[sizeAvro];
in.read(avroBinaryValue, 0, sizeAvro);
int sizeSchema = in.readInt();
schemaNameBytes = new byte[sizeSchema];
in.read(schemaNameBytes, 0, sizeSchema);
lastModifiedDate = in.readLong();
// read done
System.out.println(new String(avroBinaryValue));
System.out.println(new String(schemaNameBytes));
System.out.println(lastModifiedDate);
}
它打印
whatever os is
DEMOGRAPHIC
1379811105109
我了解您正在尝试节省空间,但最好将每个字段写入自己的列或使用 XML 或 JSON 等标准格式来序列化您的字段。