You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java序列化到不同流时输出不一致的原因排查

XML特殊字符输出异常问题排查

我遇到了XML特殊字符输出异常的问题,涉及的字符串是löööschee`*‘‘§a,XML以Java的XOM Object形式传入。排查时发现,使用XOM的Serializer打印XML文本,只有直接输出到System.out才能得到正确字符串。

所用打印代码如下:

Element pEntry; // this is the XOM object I get, it contains the xml
Document document = pEntry.getDocument();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Serializer serializer = new Serializer(stream);
Serializer serializer2 = new Serializer(System.out);
try {
    serializer.write(document);
    serializer2.write(document);
} catch (IOException e) {
    System.out.println(e.getMessage());
}
System.out.println("#####################################################################");
System.out.println(stream);

异常现象

serializer2直接输出到System.out时字符串显示正常,但System.out.println(stream)输出的字符串为l??????schee`*????????a。我尝试过多种编码设置(Serializer默认编码为UTF-8,看起来是正确的),但只有直接输出到System.out能得到正确结果。

我打印了第一个流的字节,输出为:
6c ffffffc3 ffffffb6 ffffffc3 ffffffb6 ffffffc3 ffffffb6 73 63 68 65 65 60 2a ffffffe2 ffffff80 ffffff98 ffffffe2 ffffff80 ffffff98 ffffffc2 ffffffa7 61。

我知道c3 b6对应ö,这部分字节是正确的,但搞不懂前缀的ffffff是什么。

核心疑问

为什么使用相同编码,输出结果却不一样?

已尝试的操作

  • 在javac命令中添加-J-Dfile.encoding=UTF-8 → 无效果
  • 用不同编码初始化Serializer(UTF-8、UTF-16、US-ASCII)→ 只有UTF-8能让serializer2输出正确,因此确认UTF-8是正确编码
  • 将System.out.println(stream)替换为以下代码:
    String xmlContent = stream.toString(StandardCharsets.UTF_8);
    System.out.println(xmlContent);
    
    → 情况有所改善,字符串显示为l???schee`*?????a

内容的提问来源于stack exchange,提问作者Michael Lamprecht

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:25:08