Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现网络协议(XML)的好设计模式是什么?_Java_Xml_Parsing_Design Patterns - Fatal编程技术网

Java 实现网络协议(XML)的好设计模式是什么?

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。事实上,我

我想实现一个网络协议。为了获得一个可维护的设计,我正在寻找适合的模式

该协议基于XML,应使用java读取。为了简化这里的讨论,我假设示例语法:

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