Java 实现网络协议(XML)的好设计模式是什么?
我想实现一个网络协议。为了获得一个可维护的设计,我正在寻找适合的模式 该协议基于XML,应使用java读取。为了简化这里的讨论,我假设示例语法:Java 实现网络协议(XML)的好设计模式是什么?,java,xml,parsing,design-patterns,Java,Xml,Parsing,Design Patterns,我想实现一个网络协议。为了获得一个可维护的设计,我正在寻找适合的模式 该协议基于XML,应使用java读取。为了简化这里的讨论,我假设示例语法: <User> <GroupList> <Group>group1</Group> <Group>group2</Group> </GroupList> </User> 要完成此问题,请执行以下操作: 我最终选择了JAXB。事实上,我
<User>
<GroupList>
<Group>group1</Group>
<Group>group2</Group>
</GroupList>
</User>
要完成此问题,请执行以下操作: 我最终选择了JAXB。事实上,我不知道这样一个事实,即它允许使用注释从java源代码轻松创建XML模式
因此,我只需要使用用于传输的经典java对象编写代码。然后API可以很好地处理XML与XML之间的转换。我会使用使用现有的XML->POJO库模式。您正在重新发明很多轮子。第一步是学习用于读取和操作XML的现有Java类,javax.XML.*,org.XML.sax.*,org.w3c.dom.*以避免重写它们的版本。@JimGarrison我无意重写它们。相反,我想使用STax类而不是SAX进行解析,将相关数据带到纯java对象结构中。在接下来的程序代码中,这些数据将被删除。我不想在其他控制逻辑中处理这些事情。把它看作一个抽象层。@DaveNewton我想自己编写它的原因是为了允许网络应用程序有不同的协议版本!。我想向xml根节点添加一些属性来限定协议版本。在修改时,我可以轻松地使用旧类的单独包中的类。在使用linbary时,我遇到了一个问题,即无法动态更改协议定义。有什么建议吗?
class User extends AbstractObject {
static class Parser implements XMLParser {
ParserSelector ps = ...; // Initialize with GroupList.Parser
void parse(XMLStreamReader xsr){
XMLParser p = ps.getParser(...); // The corresponding parser.
// We know only that it is XMLParser statically.
p.parse(...);
if(p instanceof GroupList.Parser){
// Set the group list in the User class
}
}
}
}
class GroupList extends AbstractObject{...}
class Group extends AbstractObject{...}
class ParserSelector{
Map<String,XMLParser> = new Map<>();
void registerParser(...){...} // Registers a possible parser for subentries
XMLParser getParser(String elementName){
return map.get(elementName); // Returns the parser registered with the given name
}
}
interface XMLParser {
void parse(XMLStreamReader xsr);
}
abstract class AbstractObject{}