JAXB通过套接字Unmarshaling问题

时间:2012-06-12 17:55:21

标签: java sockets jaxb unmarshalling

很抱歉,我重复一个topik。但我不明白这里的答案

https://stackoverflow.com/a/9598909/1404852 “Kafka”说他通过使用XMLEventWriter修复了解组块。导致建议在Stream Strings中写入然后将它们连接到unmarshal不适合我。

我有这样的代码。

public class InputThread implements Runnable {
    private BufferedReader in;  
    private String fserver; // = CharBuffer.allocate(0);
    private static final Logger LOG = Logger.getLogger(InputThread.class);
    private JAXBContext jaxbContext;
    private Unmarshaller jaxbUnmarshaller;
    private XMLProtocol protocol;

    public InputThread(Socket fromserver, BufferedReader in) throws IOException, JAXBException {
        jaxbContext = JAXBContext.newInstance(XMLProtocol.class);
        jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        this.in = in;
        new Thread(this);
    }

    public void run() {
        while (true) {
            try {
                if (in.ready()) 

                    protocol = (XMLProtocol) jaxbUnmarshaller.unmarshal(in);


            }
        }
    }

}

或者在服务器端我应该插入流的结尾?但我认为JAXB可以做任何事情......

1 个答案:

答案 0 :(得分:0)

流可以编码前面的长度,它可以用EOF这样的特殊字符结束,或者服务器可以关闭连接。如果您预先对长度进行编码,则可能需要构造某种特殊的输入流,这些输入流在许多字符之后自行关闭。这就像带有Content-Length标头和流水线的HTTP。如果您以EOF之类的特殊字符结尾,则必须将该字符视为保留字符。此外,如上所述,您需要一个特殊的输入流。这次它在读取特殊字符时很接近。它不会出现在您的数据中,因为它现在是一个元字符。关闭连接就像没有流水线的HTTP。