Pergunta

Eu estou olhando para criar XML Document objetos em Java e serializar-los para uma matriz de bytes (antes de enviá-los através de uma conexão TCP). Atualmente tenho código que se parece com isso:

public byte [] EncapsulateThingy( ThingyType thingy )
{
    parser.reset(); // parser is a pre-existing DocumentBuilder object
    Document doc = parser.newDocument();
    doc.appendChild( doc.createElement("Thingy") );
    // ...  add nodes to doc to represent thingy
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream( 8192 ); 

    //
    // Missing: Write doc to outputStream with xml version 1.0 and UTF-8 
    // encoding.
    //

    return outputStream.toByteArray();
}

A documentação Sun Java tem informações sobre um conjunto de interfaces que parece começar com DomImplementationLS para carga e XML poupança, o que eu poderia usar para preencher a peça que faltava acima com folga. Mas eu não consigo descobrir como criar um objeto que implementa DomImplementationLS.

Meu objetivo final é para serializar e desserializar objetos muito simples para XML codificado em matrizes de bytes, para que eu possa transmiti-los através de uma rede. Estou interessado em manter o peso leve solução, de modo que ele pode lidar com uma alta taxa de transferência de mensagens.

Estou interessado em soluções alternativas, desde que deixe-me especificar a estrutura XML exata que é enviado.

Eu, claro, tem que fornecer a desserialização quando essas mensagens XML são consumidos, mas há uma abundância de documentação e toturials disponível on-line para a leitura de XML, mas não muito para escrevê-lo.

Eu preferiria soluções que estão incluídos no Java 6, sem adição de pacotes.

Foi útil?

Solução

Espero que isso ajude:

import java.io.ByteArrayOutputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.junit.Test;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.ls.DOMImplementationLS;
import org.w3c.dom.ls.LSOutput;
import org.w3c.dom.ls.LSSerializer;

public class DomLsTest {

    @Test
    public void testDomLs() throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        DOMImplementation di = db.getDOMImplementation();
        Document d = di.createDocument("", "foo", null);
        Element e = d.createElement("bar");
        d.getDocumentElement().appendChild(e);
        DOMImplementationLS ls = (DOMImplementationLS) di;
        LSOutput lso = ls.createLSOutput();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        lso.setByteStream(baos);
        LSSerializer lss = ls.createLSSerializer();
        lss.write(d, lso);
        System.out.println(baos.toString());
    }

}

Assim, por seu código, você precisa fazer algo como:

DOMImplementationLS ls = (DOMImplementationLS) parser.getDOMImplementation();
LSOutput lso = ls.createLSOutput();
lso.setByteStream(...);
LSSerializer lss = ls.createSerializer();
lss.write(..., lso);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top