看到如下方法签名时,我感到非常不舒服:
public void foo(String theXml);
Run Code Online (Sandbox Code Playgroud)
什么将fooFO如果通过用UTF-16 XML声明开头的字符串?在我看来,XML应该被输入为强XML类型,如DOM树或字节数组.因此,foo应该重新声明为:
public void foo(Byte[] theXml);
Run Code Online (Sandbox Code Playgroud)
通常,当读取theXml具有特定编码时,程序员将不必要地假设.通常只是希望文件库的默认值能正确猜测.
我怎样才能激励我的同事呢?
不兼容的文档头编码声明的动机太弱了.(使用强类型或字节数组将阻止对文档进行简单的解析/修改.)我已经多次看到由于这种错误而导致编码中断的情况.
将XML作为一个传递String并不比传递它更错byte[]- 如果输入已经被解码,您可以高兴地忽略处理指令中的解码提示.您担心对编码做出错误的假设,但如果您使用字符串,则编码不是问题,因为您不必解码任何内容.(当然有人可以从原始字节构造字符串并在那时做出错误的假设,这当然会是一个问题.但是,如果你接受一个byte[]参数,有人可能已经有一个字符串并使用字符串将其转换为字节不正确的字符集.)
解析字符串输入并不像解析来自解码源的输入那样陌生(java.io.Reader或者System.IO.TextReader大多数XML解析器允许你这样做),这将我们带到另一个主题:我建议不要将未解析的XML作为字符串或字节数组完全传递 - 你会得到更多灵活性,如果您使用InputStreams(对于您不知道编码的源)和Readers(如果您确实知道编码,或者由于某种原因不需要解码数据).您还可以获得整个文档在解析之前不需要驻留在内存中的好处.
所以,而不是这个:
public void foo(String theXml);
public void foo(byte[] theXml);
// Usage:
foo("<document />");
foo("<?xml version='1.0' encoding='UTF-8' ?><document />".getBytes("UTF-8"));
Run Code Online (Sandbox Code Playgroud)
......你有:
public void foo(Reader source);
public void foo(InputStream source);
// Usage:
foo(new StringReader("<document />"));
foo(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8' ?><document />"
.getBytes("UTF-8")));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |