首页 > 解决方案 > 字符串序列化单元测试失败

问题描述

在为序列化运行 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);
  }
}

什么问题?以及如何解决?

标签: javastringserializationjunit

解决方案


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;
} 

推荐阅读