none
Converter classes de serialização java para c#, DataOutputStream, ByteArrayOutputStream. RRS feed

  • Pergunta

  • Pessoal, estou com um problema, pois preciso de converter algumas classes que são usadas para fazer operações com objetos, para que possam ser transmitidos da aplicação desktop(c#) para o servlet(java) e vice e versa, estou conseguindo realizar as operação normalmente, pois como paleativo criei uma dll com as classe de java através do visual j#, mas isso não pode ficar assim, pois só a dll vjslib tem 3mb e quando isso precisar de ser usado em celular fica inviavel. Abaixo uma das classe principais que resolvendo o problema com ela provavelmente consigueirei fazer das outras e também a minha tentativa de conversão para c#, mas a minha classe de c# não consegue deserializar corretamente o objeto, por favor se alguém puder ajudar, ficarei grato:

    Classe java:

    package Serializacao;



    public class ObjetoSerial
    {

        private String nome;
        private byte[] dados;

        /**
         *
         */
        public ObjetoSerial()
        {
            nome = "";
            dados = new byte[0];
        }

        public ObjetoSerial(Serializavel _objeto) throws Exception
        {
            nome = _objeto.getNomeClasse();
            dados = _objeto.serializar();
        }

        public void setNomeClasse(String nome)
        {
            this.nome = nome;
        }

        public void setDados(byte[] dados)
        {
            this.dados = dados;
        }

        public byte[] serializar() throws java.io.IOException
        {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            dos.writeUTF(nome);
            dos.writeInt(dados.length);
            dos.write(dados);
            return baos.toByteArray();
        }

        public ObjetoSerial deserializar(byte[] _dados) throws java.io.IOException
        {
            ByteArrayInputStream bais = new ByteArrayInputStream(_dados);
            DataInputStream dis = new DataInputStream(bais);
            nome = dis.readUTF();
            dados = new byte[dis.readInt()];
            dis.readFully(dados);

            return this;
        }

        public String getNomeClasse()
        {
            return nome;
        }

        public byte[] getDados()
        {
            return dados;
        }
    }

     

    Minha tentativa de tradução para c#:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using Serializacao;

    namespace obSerial
    {
       public class ObjetoSerial
    {

        private String nome;
        private byte[] dados;


        public ObjetoSerial()
        {
            nome = "";
            dados = new byte[0];
        }

        public ObjetoSerial(Serializavel _objeto)
        {
            nome = _objeto.getNomeClasse();
            dados = Util.Util.parseSByteToByte(_objeto.serializar());
        }

        public void setNomeClasse(String nome)
        {
            this.nome = nome;
        }

        public void setDados(byte[] dados)
        {
            this.dados = dados;
        }

        public byte[] serializar()
        {
            MemoryStream mem = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(mem);
            bw.Write(nome);
            bw.Write(dados.Length);
            bw.Write(dados);
            return mem.ToArray();
        }

        public ObjetoSerial deserializar(byte[] _dados)
        {
            MemoryStream mem = new MemoryStream(_dados);
          
            BinaryReader br = new BinaryReader(mem);
            StreamReader str = new StreamReader(mem);
            mem.Position = 0;
            nome = str.ReadToEnd();
            nome = br.ReadString();
            br.Read(dados, (int)mem.Position, br.ReadInt32());
            return this;
        }

        public String getNomeClasse()
        {
            return nome;
        }

        public byte[] getDados()
        {
            return dados;
        }
    }

    }

    a minha por exemplo quando eu escuto o readstring do binaryreader não pega o nome da classe.

    quinta-feira, 26 de agosto de 2010 19:48

Respostas

  • Bem eu vi que a dll que implementa as classes java.io do ikvmc tem uns 3 megas tmb...

    Outra solução é implementar as classes java que vc prescisa em C#... no site DocJar tem os fontes das mesma em java... na grande maioria não é tão dificil assim de converter para C#.... tanto que aproveitei e ja fiz isso para vc...

    http://cid-0b3a201d150accea.office.live.com/self.aspx/P%c3%bablico/java.zip

    deu uma dll de 16kb e ja tem implementada as classes:

    java.io.ByteArrayInputStream
    java.io.ByteArrayOutputStream
    java.io.Closeable
    java.io.DataInput
    java.io.DataInputStream
    java.io.DataOutput
    java.io.DataOutputStream
    java.io.FilterInputStream
    java.io.FilterOutputStream
    java.io.Flushable
    java.io.InputStream
    java.io.OutputStream
    java.io.PushbackInputStream

     


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    • Marcado como Resposta Vinicius Vieira sexta-feira, 27 de agosto de 2010 19:26
    sexta-feira, 27 de agosto de 2010 19:11
    Moderador

Todas as Respostas

  • Olha... não seria muito mais facil vc usar um padrão comum entre ambas linguagens... como Xml ou Json ?

    Se o problema é que o arquivo xml fica muito maior que um arquivo binario.. não seria o caso de fazer uma compressão (no caso Zip que é acessvel por ambas linguagens) ?

    Em java vc pode usar o XMLEncoder com ZipFile e no C# o SharpZipLib e o XmlSerializer


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....

    quinta-feira, 26 de agosto de 2010 21:00
    Moderador
  • Então cara, foi feito dessa forma porque quando o cliente que vai consultar o servlet é um aplicação mobile escrita em java ele não tem suporte a json por exemplo, pelo menos foi o que os desenvolvedores que cuidam disso alegaram, eu não conheço java o sulficiente para afirmar, quando cheguei aqui na empresa,  já havia essa implementação e só estou adaptando minha aplicação desktop em c# para se comunicar, aliás ela já está se comunicando, mas utilizando-se de um dll em j# gostaria tudo ficasse em c# mesmo!
    sexta-feira, 27 de agosto de 2010 13:39
  • Entendi.... bem vc poderia enviar a estrutura dos dados e um exemplo dos dados binarios que vc esta recebendo (Converte para StringBase64) ? Talves olhando as informações a gente possa ver algum padrão...

    Se fosse do C# para o java seria mais facil :S

    P.S.:

    Da uma olhada nesse negocio aqui...
    http://www.ikvm.net/userguide/ikvmc.html

    "The ikvmc tool converts Java bytecode to .NET dll's and exe's'


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....

    sexta-feira, 27 de agosto de 2010 14:14
    Moderador
  • Bem eu vi que a dll que implementa as classes java.io do ikvmc tem uns 3 megas tmb...

    Outra solução é implementar as classes java que vc prescisa em C#... no site DocJar tem os fontes das mesma em java... na grande maioria não é tão dificil assim de converter para C#.... tanto que aproveitei e ja fiz isso para vc...

    http://cid-0b3a201d150accea.office.live.com/self.aspx/P%c3%bablico/java.zip

    deu uma dll de 16kb e ja tem implementada as classes:

    java.io.ByteArrayInputStream
    java.io.ByteArrayOutputStream
    java.io.Closeable
    java.io.DataInput
    java.io.DataInputStream
    java.io.DataOutput
    java.io.DataOutputStream
    java.io.FilterInputStream
    java.io.FilterOutputStream
    java.io.Flushable
    java.io.InputStream
    java.io.OutputStream
    java.io.PushbackInputStream

     


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    • Marcado como Resposta Vinicius Vieira sexta-feira, 27 de agosto de 2010 19:26
    sexta-feira, 27 de agosto de 2010 19:11
    Moderador
  • Olha ae cara muito obrigado, vou olhar suas implementações e usar-las aqui no meu programa, conseguindo fazer funcionar eu coloco aqui para você ver como ficou, e posteriormente poder ajudar outras pessoas.

    Muito Obrigado mesmo tudo de bom!

    sexta-feira, 27 de agosto de 2010 19:25
  • Otimo...

    Principalmente se prescisar implementar mais alguma classe em java manda ai para gente :) cara como é chato isso kkkkk

    Só um adendo... eu tava pesquisando e parece so que o BitConverter.DoubleToInt64Bits tem uma diferença em relação do Double.toInt64Bits() do java quando retorna um Double.NaN, parece q o primeiro bit do java é "cf" e no C# é "ff"

    Fora isso não pareceu que ia ter problemas no resto....


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    There is no place like 127.0.0.1
    Só existem 10 tipos de pessoas no mundo... as que leem em binario e as outras...
    Se não da certo como voce esta fazendo... Tente fazer de um jeito totalmente diferente....
    sexta-feira, 27 de agosto de 2010 19:42
    Moderador