2014-01-22 1 views
0

Я использую XStream для сериализации сущностей, но мой объект имеет двойное поле, и мне нужно сериализовать двойное поле, используя запятую в качестве десятичной метки.Использование XStream и 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(); 
    } 
+0

Вы можете включать в пример того, что вам это нужно, чтобы выглядеть? – user314104

+0

2,2675

+0

мне это нужно 2,2675

ответ

-2

Я решил эту проблему, используя этот код:

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

} 
+0

Я голосовал этот ответ вниз, потому что решение проблемы основывается на этой линии:. 'Gravar.write (x.toXML (л) .ToString() заменить (» . ",", "). getBytes());'. Это решение очень хрупкое: каждое поле в 'l', которое сериализуется в строку, содержащую«. ». теперь будет заменено все "." на ",". Например, если 'l' содержит поле' private String comment; ', а' comment' заполняется символом «Пример текста, конец»., Код сериализации в этом ответе превратит это в «Пример текста, конца, «неустранимо. – user314104

+0

Я использую замену, потому что мне нужно импортировать этот xml в другую программу, и эта другая программа использует «,» как десятичные значения. –

+0

Взгляните на ответ, который я предложил выше; он обеспечивает конверсии в/из двойных значений, испуская «,» в качестве разделителя десятичных чисел (на основе немецкого языка). Текущий код только форматирует 'Double', но метод может быть тривиально расширен для типа 'Float'. Обратите внимание, что мой примерный код не выполняет скрытое преобразование «.». на ",", поэтому он не демонстрирует недостаток, обсуждаемый здесь. – user314104

2

Что вы ищете обычай AbstractSingleValueConverter для Double класса в XStream, зарегистрированных против экземпляра 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); 
      } 
     } 
    } 
} 

Выберите подходящий NumberFormat на основе Locale вы желаете, чтобы выполнить правильное преобразование формата. Класс LocaleAwareDoubleConverter в этом примере использует это для преобразования в нужный формат.

Смежные вопросы