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 =

我试图验证我的自定义Java对象是否正确序列化/反序列化,并且我可以对文件、流等使用这种序列化机制。这是我创建的测试。这是正确的方法吗

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值都有效。字符串不是二进制数据的容器。字节[]是二进制数据的容器。