Question

I'm using XStream to serialize my entities, but my entity has a double field, and I need to serialize the double field using a comma as the decimal mark.

In the code below, Lastro is a double:

    XStream x = new XStream();
    x.autodetectAnnotations(true);

    x.alias("Log", LogBook.class);                      //   
    x.alias("LogBook", Log.class);

    x.aliasField("IDLogbook" , LogBook.class, "idLogBook");
            x.aliasField("Lastro" , LogBook.class, "lastroKg");

File file = new File(CAMINHO_XML);
    FileOutputStream save;
    try {
        save= new FileOutputStream(file);
        save.write(x.toXML(l).getBytes());
        save.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }
Was it helpful?

Solution 2

I solved this problem using this code:

public static void serializeObject( Log l, String Pression,i nt ID) {

    XStream x = new XStream();
    x.autodetectAnnotations(true);

    x.alias("Log", LogBook.class);                      // rename o root node  or the class
    x.alias("LogBook", Log.class);

    x.aliasField("IDLogbook" , LogBook.class, "idLogBook"); // rename  attribute class
    x.aliasField("DateDive" , LogBook.class, "date");
    x.aliasField("Local" , LogBook.class, "local");
    x.aliasField("Contry" , LogBook.class, "Contry");
    x.aliasField("City" , LogBook.class, "city");
    x.aliasField("State" , LogBook.class, "State");
    x.aliasField("boddy" , LogBook.class, "boddy");
    x.aliasField("operator" , LogBook.class, "operator");
    x.aliasField("modality" , LogBook.class, "modality");
    x.aliasField("category" , LogBook.class, "category");
    x.aliasField("qualityDive" , LogBook.class, "qualityDive");
    x.aliasField("UsedTable" , LogBook.class, "UsedTable");
    x.aliasField("hourBegin" , LogBook.class, "hourBegin");

    x.aliasField("PEA" , LogBook.class, "PEA");
    x.aliasField("PPO2" , LogBook.class, "PPO2");

    x.aliasField("visibility" , LogBook.class, "visibility");
    x.aliasField("Manômetro" , LogBook.class, "manometro"); 
    x.aliasField("cilindermodel" , LogBook.class, "cilindermodel");
    if (Pressao.equals("Bar")){
        x.aliasField("PressionIN" , LogBook.class, "pressionInBar");
        x.aliasField("PressionOUT" , LogBook.class, "pressionOutBar");  
    }else{
        x.aliasField("PressionIN" , LogBook.class, "pressionInPsi");    
        x.aliasField("PressionOUT" , LogBook.class, "pressionOutPsi");  
    }

    x.aliasField("Oxigen" , LogBook.class, "Oxigen");   
    x.aliasField("Nitorgen" , LogBook.class, "Nitorgen");

    x.omitField(LogBook.class, "tipoPressionPSI"); // turn field hold
    x.omitField(LogBook.class, "eanX");

    x.alias("Caverna", LogBookCaverna.class);

    x.aliasField("IDLogbook" , LogBookCaverna.class, "idLogBook");  // renomeia o atributo da classe
    x.aliasField("NomeCaverna" , LogBookCaverna.class, "nomeCaverna");      
    x.aliasField("ComoChegar" , LogBookCaverna.class, "comoChegar");
    x.aliasField("Profundidade" , LogBookCaverna.class, "profundidadeM");
    x.aliasField("Penetração" , LogBookCaverna.class, "penetracaoM");
    x.aliasField("RotaUsada" , LogBookCaverna.class, "rotaUsada");
    x.aliasField("EquipEspeologiaUsado" , LogBookCaverna.class, "equipUsado");
    x.aliasField("Obs" , LogBookCaverna.class, "obs");
    x.omitField(LogBookCaverna.class, "penetracaoMaxConhecidaM");   // omite o atributo da classe
    x.omitField(LogBookCaverna.class, "penetracaoMaxConhecidaF");
    x.omitField(LogBookCaverna.class, "profundidadeMaxConhecidaM");
    x.omitField(LogBookCaverna.class, "profundidadeMaxConhecidaF");     
    x.omitField(LogBookCaverna.class, "idLogBookCaverna");  
    x.omitField(LogBookCaverna.class, "LogBookCaverna");

    x.alias("Complement", LogBookComplement.class);

    x.aliasField("Complemento" , LogBookComplemento.class, "complemento");
    x.aliasField("IDLogbook" , LogBookComplemento.class, "idLogBook");  // renomeia o atributo da classe
    x.aliasField("Tempo" , LogBookComplemento.class, "tempo");
    x.aliasField("Entrada" , LogBookComplemento.class, "entrada");
    x.aliasField("TipoÁgua" , LogBookComplemento.class, "tipoAgua");
    x.aliasField("CondiçãoMar" , LogBookComplemento.class, "condicoesMar");
    x.aliasField("Acesso" , LogBookComplemento.class, "acessoLocal");
    x.aliasField("Facilidades" , LogBookComplemento.class, "facilidades");
    x.aliasField("Dificuldades" , LogBookComplemento.class, "dificuldades");        
    x.aliasField("Corrente" , LogBookComplemento.class, "correnteMaritima");
    x.aliasField("Obs" , LogBookComplemento.class, "obs");
    x.omitField(LogBookComplemento.class, "idLogBookComplemento");  
    x.omitField(LogBookCaverna.class, "LogBookComplemento");    

    x.alias("Custos", LogBookCustos.class);
    x.aliasField("IDLogbook" , LogBookCustos.class, "idLogBook");   // renomeia o atributo da classe
    x.aliasField("CustoViagem" , LogBookCustos.class, "custoViagem");
    x.aliasField("CustoEmbarcação" , LogBookCustos.class, "custoEmbarcacao");
    x.aliasField("CustoEquipamentos" , LogBookCustos.class, "custoEquipamentos");
    x.aliasField("CustoDeslocamento" , LogBookCustos.class, "custoDeslocamento");
    x.aliasField("CustosDiversos" , LogBookCustos.class, "custoDiversos");
    x.aliasField("Obs" , LogBookCustos.class, "obs");
    x.omitField(LogBookCustos.class, "logBook");
    x.omitField(LogBookCustos.class, "custoFinal");

    x.alias("Embarcação", LogBookEmbarcacao.class);
    x.aliasField("IDLogbook" , LogBookEmbarcacao.class, "IDLogbook");
    x.aliasField("NomeEmbarcação" , LogBookEmbarcacao.class, "nomeEmbarcacao");
    x.aliasField("Comprimento" , LogBookEmbarcacao.class, "comprimentoM");
    x.aliasField("CapitãoMestre" , LogBookEmbarcacao.class, "capitaoMestre");
    x.aliasField("NúmMergulhadores" , LogBookEmbarcacao.class, "numMergulhadores");
    x.aliasField("Obs" , LogBookEmbarcacao.class, "obs");
    x.omitField(LogBookEmbarcacao.class, "idLogBookEmbarcacao");
    x.omitField(LogBookEmbarcacao.class, "logBook");
    x.omitField(LogBookEmbarcacao.class, "equipSeguranca");
    x.omitField(LogBookEmbarcacao.class, "velocidade");
    x.omitField(LogBookEmbarcacao.class, "oxigenio");
    x.omitField(LogBookEmbarcacao.class, "camarotes");
    x.omitField(LogBookEmbarcacao.class, "banheiro");
    x.omitField(LogBookEmbarcacao.class, "salaTV");
    x.omitField(LogBookEmbarcacao.class, "detalhesEmbarque");
    x.omitField(LogBookEmbarcacao.class, "qualidadePlataforma");

    x.alias("Naufrágio", LogBookNaufragio.class);
    x.aliasField("IDLogbook" , LogBookNaufragio.class, "IDLogbook");
    x.aliasField("NomeNaufrágio" , LogBookNaufragio.class, "nomeNaufragio");
    x.aliasField("VisibilidadeMédia" , LogBookNaufragio.class, "IDLogbook");
    x.aliasField("Penetração" , LogBookNaufragio.class, "IDLogbook");
    x.aliasField("Comprimento" , LogBookNaufragio.class, "comprimentoM");
    x.aliasField("ComoAfundou" , LogBookNaufragio.class, "IDLogbook");
    x.aliasField("TipoNaufrágio" , LogBookNaufragio.class, "tipoNaufragio");
    x.aliasField("TipoEmbarcação" , LogBookNaufragio.class, "tipoEmbarcacao");
    x.aliasField("ProfPopa" , LogBookNaufragio.class, "popaM");
    x.aliasField("ProfProa" , LogBookNaufragio.class, "proaM");
    x.aliasField("Obs" , LogBookNaufragio.class, "obs");
    x.omitField(LogBookNaufragio.class, "propulsao");
    x.omitField(LogBookNaufragio.class, "peso");
    x.omitField(LogBookNaufragio.class, "comprimentoF");
    x.omitField(LogBookNaufragio.class, "bocaM");
    x.omitField(LogBookNaufragio.class, "bocaF");
    x.omitField(LogBookNaufragio.class, "lancadoEm");
    x.omitField(LogBookNaufragio.class, "afundouEm");
    x.omitField(LogBookNaufragio.class, "popaF");
    x.omitField(LogBookNaufragio.class, "proaF");


    x.aliasField("IDLogbook" , LogBookFauna.class, "idLogBook");
    x.aliasField("Fauna" , LogBookFauna.class, "descricaoFauna");   

    String CAMINHO_XML = Environment.getExternalStorageDirectory() + "/Dive/logbook_" + ID + ".xml";


    File arquivo = new File(CAMINHO_XML);

    FileOutputStream gravar;
    try {
        gravar = new FileOutputStream(arquivo);
        //gravar.write(x.toXML(l).getBytes());
        gravar.write(x.toXML(l).toString().replace(".", ",").getBytes());
        gravar.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    }

}

OTHER TIPS

What you're looking for is a custom AbstractSingleValueConverter for the Double class in XStream, registered against the XStream instance.

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;

public class App {
    // Placeholder class
    public static class LogBook {

    }
    // Placeholder class
    public static class Log {

    }

    public static final String CAMINHO_XML = "cahminho.xml";

    public static void serialize(LogBook l) {
        XStream x = new XStream();

        LocaleAwareDoubleConverter c = new LocaleAwareDoubleConverter();

        // Set your desired locale here; German happens to use the desired format
        c.setLocale(Locale.GERMAN);
        x.registerConverter(c);

        x.autodetectAnnotations(true);

        x.alias("Log", LogBook.class);
        x.alias("LogBook", Log.class);

        x.aliasField("IDLogbook", LogBook.class, "idLogBook");
        x.aliasField("Lastro", LogBook.class, "lastroKg");

        File file = new File(CAMINHO_XML);
        FileOutputStream save;
        try {
            save = new FileOutputStream(file);
            save.write(x.toXML(l).getBytes());
            save.close();
        } catch (IOException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    // Remove the static qualifier to put this class into a separate file
    public static class LocaleAwareDoubleConverter extends AbstractSingleValueConverter {

        private NumberFormat format = NumberFormat.getInstance();

        public void setLocale(Locale l) {
            format = NumberFormat.getInstance(l);
        }

        public boolean canConvert(Class clazz) {
            return clazz.equals(Double.class);
        }

        // This is where the magic happens...
        public String toString(Object o) {
            return format.format((Double) o);
        }

        // And to turn the string back into a Double, we do this
        public Object fromString(String str) {
            try {
                return format.parse(str).doubleValue();
            } catch (ParseException ex) {
                Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
                throw new IllegalArgumentException(str, ex);
            }
        }
    }
}

Choose an appropriate NumberFormat based on the Locale you desire in order to perform the correct format conversion. The LocaleAwareDoubleConverter class in the example uses this to convert to the right format.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top