java - 字符串序列化单元测试失败
问题描述
在为序列化运行 Junit 测试后String
,它失败并给了我以下结果:
预期:"netmodel"
实际:"l"
序列化方法如下
public static void serializeString(String objectToSerialize, OutputStream outputStream) {
byte[] bytesArr = objectToSerialize.getBytes();
serializeInt(bytesArr.length, outputStream);
try {
outputStream.write(bytesArr);
} catch (IOException e) {
e.printStackTrace();
}
}
而我的反序列化方法如下
public static String deserializeString(InputStream inputStream) {
String deserializeObject = "";
char asciiToChar;
int stringByteArrayLength = deserializeInt(inputStream);
byte[] databytesArr = new byte[stringByteArrayLength];
try {
inputStream.read(databytesArr, 0, stringByteArrayLength);
}
catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < databytesArr.length; i++) {
asciiToChar = (char) databytesArr[i];
deserializeObject = "" + Character.toString(asciiToChar);
}
return deserializeObject;
}
最后,我写了一个单元测试如下
public class StringSerializerTest {
private InputStream iStream;
private ByteArrayOutputStream oStream;
@Before
public void init() {
oStream = new ByteArrayOutputStream();
}
String serialzeAndDeserializeObject(String stringValue) {
OutputStreamUtil.serializeString(stringValue, oStream);
iStream = new ByteArrayInputStream(oStream.toByteArray());
return InputStreamUtil.deserializeString(iStream);
}
@Test
public void equals_equal() {
String stringValue = "netmodel";
String deserializedStringValue = serialzeAndDeserializeObject(stringValue);
assertThat(deserializedStringValue).isEqualTo(stringValue);
}
}
什么问题?以及如何解决?
解决方案
您deserializeObject
在每次迭代期间重新分配 的整个值
for (int i = 0; i < databytesArr.length; i++) {
asciiToChar = (char) databytesArr[i];
deserializeObject = "" + Character.toString(asciiToChar);
}
这导致只有最后一个字符(l
在这种情况下)被存储在deserializeObject
. 此循环应将下一个字符附加deserializeObject
到如下所示:
for (int i = 0; i < databytesArr.length; i++) {
asciiToChar = (char) databytesArr[i];
deserializeObject += Character.toString(asciiToChar);
}
更正的反序列化逻辑将是:
public static String deserializeString(InputStream inputStream) {
String deserializeObject = "";
char asciiToChar;
int stringByteArrayLength = deserializeInt(inputStream);
byte[] databytesArr = new byte[stringByteArrayLength];
try {
inputStream.read(databytesArr, 0, stringByteArrayLength);
}
catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < databytesArr.length; i++) {
asciiToChar = (char) databytesArr[i];
deserializeObject += Character.toString(asciiToChar);
}
return deserializeObject;
}
推荐阅读
- r - 如何在 R 中的多个 word 文件上运行 for 循环
- botframework - ChatBot 在 Web Emulator 中不起作用,但在 Local Bot Framework 仿真器中运行良好
- ruby - 检查文本文件是否以特定方式格式化
- node.js - 在 heroku 上部署 express 项目时出错
- android - 如何从 .txt 文件填充自定义列表视图?安卓工作室
- git - 将我的项目推送到我的仓库但没有传输文件而是创建了一些奇怪的文件
- javascript - 正则表达式对于版本号失败
- c++ - Lua C API - 从 C++ 分配和使用类的对象成员
- react-native - React-Native 在图像中使用状态需要
- asp.net-core - .NET Core 身份作为 UI 显示登录页面(如果未登录)