簡體   English   中英

使用XStream並用逗號加倍

[英]Using XStream and double with comma

我正在使用XStream序列化我的實體,但是我的實體具有一個double字段,並且我需要使用逗號作為小數點來序列化double字段。

在下面的代碼中,Lastro是雙精度型:

    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();
    }

您正在尋找的是針對XStream中Double類的自定義AbstractSingleValueConverter ,已針對XStream實例注冊。

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);
            }
        }
    }
}

根據所需的Locale選擇適當的NumberFormat ,以執行正確的格式轉換。 示例中的LocaleAwareDoubleConverter類使用此類將其轉換為正確的格式。

我使用以下代碼解決了這個問題:

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();
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM