gpt4 book ai didi

java - 为什么在 Java 序列化框架中允许创建语法上非法的 QName?

转载 作者:行者123 更新时间:2023-11-30 08:23:54 26 4
gpt4 key购买 nike

我遇到过很多 JAXB 序列化错误,这些错误是由代码在不同位置创建无效的限定名称这一事实引起的。我正在研究我正在使用的 API 和其他 Java XML 选项,一件奇怪的事情是实现限定名称的类似乎根本不进行任何输入检查。

这确实是有问题的,因为复杂的代码会生成各种 JAXB 对象,直到编码时您才发现出现了可怕的错误。异常堆栈通常不会告诉您哪个元素/属性有问题,只会告诉您出了什么问题。

对于这些库来说,让创建不可序列化的内容变得更加困难不是更有意义吗?

这是一个代码片段:为什么它有效?它不应该抛出一个 IllegalArgumentException 吗?在其他定义 QName 的 API 中,行为是相同的。此类的 javadoc 指定如果命名空间为 null,您将得到一个 IllegalArgumentException,否则不会。

    QName q = new QName("Namespace URI is supposed to be an anyURI, but clearly !!THIS ISN'T!!", 
"Local part is supposed to be an NCName, but clearly !!THIS ISN'T!!",
"<><><><>&&& Laughably Invalid Namespace Prefix");
System.out.println(q);

引用文献:Relevant javadoc for QName , spec constraints stating name is an anyURI, and localpart is an NCName .换句话说,根据规范,无论序列化如何,上面的代码都是明显无效的。

最佳答案

这里假设。

QName 构造函数的主要用户很可能不是通用 Java 代码本身,而是 XML 解析器。

XML 解析对性能敏感。如果解析器正在调用构造函数,理论上解析器已经验证了语法,因此再次验证它是浪费时间。

这是 95% 的问题。为什么要为 5% 的用户付出代价。

如果您想要一个验证 QName 构造函数,您可以扩展 QName 并添加您自己的代码。

例如:

public class VerifiedQName extends QName {
public VerifiedQName(String namespaceURI, String localPart) {
super(namespaceURI, localPart);
verfiyNamespaceURI(namespaceURI); // throws IllegalArgumentException
verifyLocalPart(localPart); // throws IllegalArgumentException
}
...
}

至少该类被记录为未验证。

关于java - 为什么在 Java 序列化框架中允许创建语法上非法的 QName?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23342229/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com