2015-05-30 34 views
0

我有一個簡單的轉換。我有一個java對象轉換成不同的java對象。所以我用xslt。 jaxb是我的處理器。使用jaxb進行XSLT處理以獲得較小的轉換性能

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
      StreamSource streamSource = new StreamSource(
        new File("conv.xsl")); 
      Transformer transformer = transformerFactory.newTransformer(streamSource); 
      JAXBContext jc =JAXBContext.newInstance(Bags.class); 
      JAXBSource jAXBSource = new JAXBSource(jc, device); 
jAXBResult = new JAXBResult(JAXBContext.newInstance(LargeBags.class)); 

      transformer.transform(jAXBSource, jAXBResult); 

return result.getResult(); 

它是確定做這樣的業績看?我可以用java代碼來做到這一點。這是一個很大的性能問題?或者一個好的做法?請幫助我,並感謝您的意見。除此之外如果我有小分組和計算是xslt是一個好方法?

回答

0

從性能角度來看,它當然不是最優的:序列化到xml,轉換xml,從xml進行反序列化是昂貴的操作。 但是,如果你有很多'類似'類(例如不同的字段名稱,但是匹配邏輯(例如具有用戶其他人字段等)),那麼編輯xslt表單以提供實現轉換更快,更容易比創造新的適配器類。

但是你一定要加快速度,

創建的JAXBContext一次,而不是在每次調用,創建JAXB上下文是非常昂貴的操作。例如,它儲存在一個地圖,鍵是用於JaxbCreation的類:

JAXBContext getContext(Class cls) { 
    if (contexts.containsKey(cls)) return contexts.get(cls); 
    JAXBContect context = JAXBContext.newInstance(cls); 
    contexts.put(cls,context); 
    return context; 
} 
... 
JAXBContext jc =getContext(Bags.class); 

與變壓器相同的伎倆。

只要記住變壓器不是線程安全的,所以你需要 同步在變壓器使用之前是如果你的應用程序是多線程的。