2014-01-22 38 views
0

我使用XStream序列化我的实体,但我的实体有一个双字段,我需要使用逗号作为小数点标记序列化双字段。使用XStream和双逗号

在下面的代码,拉斯特罗是双:

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(L)的ToString()代替(” 。“,”,“)。getBytes());'。这个解决方案非常脆弱:'l'中的每个字段都被序列化为一个包含“。”的字符串。现在将所有的“。”替换为“,”。例如,如果'l'包含一个字段'private String comment;',并且'comment'填充了''Example text,end。“',那么这个答案中的序列化代码会将它变成”Example text,end, “无法恢复。 – user314104

+0

我使用替换,因为我需要在其他程序中导入此xml,而此其他程序使用“,”就像十进制值。 –

+0

看看我上面提出的答案;它向/从Double值提供转换,以小数分隔符(基于德语区域设置)发出“,”。目前的代码只是格式化'Double',但是这个方法也可以扩展到'Float'类型。请注意,我的示例代码不执行“。”的全面转换。到“,”,所以它没有表现出这里讨论的不足。 – user314104

2

什么你要找的是为Double类的XStream,对XStream的实例注册自定义AbstractSingleValueConverter

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类使用它来转换为正确的格式。