Java 如何验证对象序列化机制?
我试图验证我的自定义Java对象是否正确序列化/反序列化,并且我可以对文件、流等使用这种序列化机制。这是我创建的测试。这是正确的方法吗Java 如何验证对象序列化机制?,java,Java,我试图验证我的自定义Java对象是否正确序列化/反序列化,并且我可以对文件、流等使用这种序列化机制。这是我创建的测试。这是正确的方法吗 public class SerializableTest { @Test public void shouldSerialize() throws Exception { Foo foo = new Foo(123); // serialize it to a string ByteArrayOutputStream out =
public class SerializableTest {
@Test public void shouldSerialize() throws Exception {
Foo foo = new Foo(123);
// serialize it to a string
ByteArrayOutputStream out = new ByteArrayOutputStream();
new ObjectOutputStream(out).writeObject(foo);
String written = out.toString();
// read it back
ByteArrayInputStream in = new ByteArrayInputStream(written.getBytes());
Foo foo2 = (Foo)(new ObjectInputStream(in).readObject());
// check that two objects are identical
assertEquals(foo, foo2);
}
}
这里出了什么问题?您正在尝试将二进制数据解码为文本,然后再编码回二进制。总是个坏主意
您还应该刷新装饰器输出流。您正在尝试将二进制数据解码为文本,然后再编码回二进制。总是个坏主意 您还应该刷新装饰器输出流。替换
String written = out.toString();
与
不能将随机二进制数据存储为字符串。字符串用于文本。替换
String written = out.toString();
与
不能将随机二进制数据存储为字符串。字符串表示文本。无任何内容,只要Foo有适当的equals实现
我不会让它通过字符串转换,因为这是一个邪恶的东西,正如另一个也已经说过的那样。什么都没有,只要Foo有一个适当的equals实现
我不会让它通过字符串转换,因为这是邪恶的,因为另一个也已经说过。从技术上讲,
String
和byte[]
之间有什么区别?相同的数据结构,但具有不同的公共接口。我只是好奇。。。除此之外,你的推荐对我很有帮助,现在测试效果很好。谢谢。@Vincenzo您可能会把字节
和字符
(字符串本质上是一个字符[]
)。要将字节数组(8位数字)转换为字符串,必须使用一些编码。如果编码不能处理您的输入(例如,这个数字没有字符),则输出是未指定的。@Vincenzo尝试使用它。比如,newstring(新字节[]{80,81,82})
和newstring(新字节[]{1,2,3})
。它不是相同的数据结构。字符串包装字符[],字符是16位无符号Unicode代码点,并非所有2^15值都有效。字符串不是二进制数据的容器。字节[]是二进制数据的容器。从技术上讲,String
和byte[]
之间有什么区别?相同的数据结构,但具有不同的公共接口。我只是好奇。。。除此之外,你的推荐对我很有帮助,现在测试效果很好。谢谢。@Vincenzo您可能会把字节
和字符
(字符串本质上是一个字符[]
)。要将字节数组(8位数字)转换为字符串,必须使用一些编码。如果编码不能处理您的输入(例如,这个数字没有字符),则输出是未指定的。@Vincenzo尝试使用它。比如,newstring(新字节[]{80,81,82})
和newstring(新字节[]{1,2,3})
。它不是相同的数据结构。字符串包装字符[],字符是16位无符号Unicode代码点,并非所有2^15值都有效。字符串不是二进制数据的容器。字节[]是二进制数据的容器。