摘要:但是將導(dǎo)入工程后,在使用時會出現(xiàn)等錯誤消息。初步認(rèn)為是與自帶的沖突。再運行工程,這個錯誤不再出現(xiàn)了,奇跡般的沒問題了。我的理解是這樣,不知道對不對,歡迎大俠指正。工程中下默認(rèn)的是,而則應(yīng)該是。所以按照該文的解決方法,更改就好了。
JSON解析庫有很多,諸如Jackson,Json-lib,org.json,Gson和fastjson等,但是fastjson以其解析速度最快而脫穎而出。詳細(xì)的測試地址如下:
https://github.com/eishay/jvm-serializers/wiki/Staging-Results
fastjson是國內(nèi)alibaba公司的wenshao開發(fā)的,項目Git地址:
https://github.com/alibaba/fastjson
今天測試了下發(fā)現(xiàn)fastjson挺好用,比Android自帶的org.json庫要好用多了。當(dāng)然我沒有對fastjson的性能進(jìn)行測試,只是因為Android自帶的不太好。
在普通的java項目下,只需要導(dǎo)入fastjson.jar就可以,無需依賴其他包,這一點相比json-lib要好多,json-lib依賴五六個包。但是將fastjson.jar導(dǎo)入Android工程后,在使用時會出現(xiàn) java.lang.NoClassDefFoundError:can"t find com.alibaba.fastjson.JSON等錯誤消息。
初步認(rèn)為是與Android自帶的org.json沖突。于是Build Path->Configure Build Path->Order And Export下將fastjson.jar上調(diào)至Android xx.jar上(xx為android 版本號)。再運行工程,這個錯誤不再出現(xiàn)了,奇跡般的沒問題了。
然后現(xiàn)在再調(diào)整fastjson.jar和Android.jar順序也不會出現(xiàn)can"t not find com.alibaba.fastjson的錯誤,不知道為何,繼續(xù)看。
文章Java虛擬機(jī)類加載順序講解了java 虛擬機(jī)加載class和jar包的順序。
bootstrap classloader ->extension classloader->system classloader
其中bootstrap引導(dǎo)類加載器;
extension classloader擴(kuò)展類加載器,它負(fù)責(zé)加載JRE的擴(kuò)展目錄(JAVA_HOME/jre/lib/ext或者由java.ext.dirs系統(tǒng)屬性指定的)中JAR的類包;
system classloader系統(tǒng)(也稱為應(yīng)用)類加載器,它負(fù)責(zé)在JVM被啟動時,加載來自在命令java中的-classpath或者java.class.path系統(tǒng)屬性或者 CLASSPATH操作系統(tǒng)屬性所指定的JAR類包和類路徑.
該文中還有一句話是這么說的,應(yīng)該能解決我們的疑惑:
“此外類加載還采用了cache機(jī)制,也就是如果 cache中保存了這個Class就直接返回它,如果沒有才從文件中讀取和轉(zhuǎn)換成Class,并存入cache,這就是為什么我們修改了Class但是必須重新啟動JVM才能生效的原因?!?/p>
我想應(yīng)該是Android虛擬機(jī)中已經(jīng)有了fastjson的cache了,所以導(dǎo)致如何更改項目的fastjson.jar和Android.jar順序都不會有任何反應(yīng)。我的理解是這樣,不知道對不對,歡迎大俠指正。
解釋到這里,也解決了我另外一個疑問,就是在Android的工程中新建一個java類,并生成main方法,然后Run->Java Application. 結(jié)果會出現(xiàn)如下的錯誤:
# # A fatal error has been detected by the Java Runtime Environment: # # Internal Error (classFileParser.cpp:3494), pid=5940, tid=5632 # Error: ShouldNotReachHere()
這個問題的產(chǎn)生就是和bootstrap classloard 有關(guān)了,文件上右鍵Run As->Run Configuration選擇Java Application下的這個Java類,然后選擇右側(cè)的Classpath標(biāo)簽頁下有兩個目錄,分別是Bootstrap Entries 和 User Entries。
Android工程中Bootsrap下默認(rèn)的是Android Classpath Container,而Java則應(yīng)該是JRE System Library。所以按照該文Error: ShouldNotReachHere()的解決方法,更改就好了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/64035.html
摘要:某年某月的某一天,本汪在某個奇葩的公司,接手了某個奇葩的項目,遇到了一些奇葩的事情,就掉進(jìn)關(guān)于做轉(zhuǎn)換時,那些關(guān)于首字符大小寫的坑??邮鬃址?,第二個字符大寫的鍵名這個坑與相關(guān),嚴(yán)格來說,應(yīng)該是挖的坑。 某年某月的某一天,本汪在某個奇葩的公司,接手了某個奇葩的項目,遇到了一些奇葩的事情,就掉進(jìn)關(guān)于fastjson做bean to json轉(zhuǎn)換時,那些關(guān)于首字符大小寫的坑。 這個奇葩項目...
數(shù)據(jù)傳輸使用json格式再方便不過了。fastjson 由阿里巴巴那伙人使用Java語言編寫,號稱最快的JSON庫前兩天遇到一個問題 后臺的數(shù)據(jù)轉(zhuǎn)化為json字符串后發(fā)送到前臺出現(xiàn)了$ref字樣的東西,后來明白了這是引用,在傳輸?shù)臄?shù)據(jù)中出現(xiàn)相同的對象時,fastjson默認(rèn)開啟引用檢測將相同的對象寫成引用的形式.說到引用分為兩種,重復(fù)引用和循環(huán)引用 重復(fù)引用 指一個對象重復(fù)出現(xiàn)多次 循環(huán)引用 指你...
摘要:問題在雙向映射時,會相互包含對方的實例,相互引用,造成遞歸迭代,堆棧溢出。分析在后端向前端傳遞的時候會將數(shù)據(jù)序列化,轉(zhuǎn)為,這時會出現(xiàn)循環(huán)引用造成堆棧溢出解決方案解決方法就是在轉(zhuǎn)換時忽略循環(huán)字段。 問題: JPA 在雙向映射時,會相互包含對方的實例,相互引用,造成遞歸迭代,堆棧溢出(java.lang.StackOverflowError)。 分析: 在后端向前端傳遞的時候會將數(shù)據(jù)序列化...
閱讀 1639·2021-11-22 13:52
閱讀 1474·2021-09-29 09:34
閱讀 2848·2021-09-09 11:40
閱讀 3091·2019-08-30 15:54
閱讀 1322·2019-08-30 15:53
閱讀 1038·2019-08-30 11:01
閱讀 1441·2019-08-29 17:22
閱讀 2019·2019-08-26 10:57