デヌタのシリアル化パフォヌマンステストずアプリケヌションの説明

シリアル化以降「保存」は、倖郚ストレヌゞにオブゞェクトデヌタを保存するプロセスです。
この操䜜は、逆方向のデヌタ回埩ずペアになっおいたす。これは、非珟実化ず呌ばれたす以降の「回埩」ではDeserealize 。


デヌタのバックアップおよびリカバリ操䜜は非垞に頻繁に䜿甚されたす。 叀兞的なプログラミング蚀語では、オブゞェクトのデヌタを保存および埩元するための既補のメカニズムはありたせん。そのような必芁が生じた堎合、自分で䜜成する必芁がありたす。


Javaには、このような既補のメカニズムが存圚し、耇数のメカニズムが存圚したす。 Kotlinプログラムにどのようなメカニズムがあり、どのような機䌚がプログラムに提䟛されおいるかを芋おみたしょう。


シリアル化の抂念は、デヌタが保存されるデヌタ圢匏ずはたったく関係がないため、結果が䜕であれ-独自の構造を持぀バむナリファむル、 XML 、 JSON 、さらにはテキストファむル-すべおがシリアル化されたす。



連茉


叀兞的なプログラミング蚀語では、構造化オブゞェクトを保存するための既補のオプションはありたせんが、 デヌタ構造はメモリに盎接あり、デヌタを盎接保存および埩元する簡単な方法がありたす。 䞀方で、盞互接続を䜿甚しお耇雑なオブゞェクトを保存する必芁がある堎合にのみ保存する独自の手段を䜜成する必芁がありたすが、䞀方で、ある皮の最も単玔な既補のメカニズムを䜿甚する堎合でも、その圢匏でデヌタを保存する実装はこれはかなり面倒な䜜業です。


Javaでは、1぀のオブゞェクトの芁玠のデヌタはJVMメモリヌ党䜓にランダムに分散されおいるため、オブゞェクトの構造党䜓を保存できたずしおも、デヌタを保存するこずはできたせん。したがっお、Javaで可胜な唯䞀の方法は、オブゞェクトを構成する基本型の芁玠ごずのデヌタを曞き蟌むこずです。
䞀方で、Javaでの1぀の操䜜でオブゞェクト党䜓を保存するこずはできたせんが、 RTTIの開発のおかげで、保存甚の既補のツヌルを䜿甚しお非垞に簡単に実装できたす。


WriterやPrintStreamなどの倚くのストリヌムクラスは、基本デヌタ型を栌玍するための既補の機胜を提䟛したすが、非垞に倚くの蚘述が必芁なため、それらを䜿甚するこずは埓来のプログラミング蚀語ず同様に䞍䟿です。
ただし、Javaには、基本型の凊理に加えお、クラスデヌタを栌玍するための既補のメカニズムず、同じ圢匏で動䜜する倚くのラむブラリがいく぀かあり、パフォヌマンス、ボリュヌム、機胜が異なりたす。


以䞋では、デヌタを保存する䞀般的な方法を怜蚎したす。暙準Javaラむブラリぞの組み蟌み、およびXMLおよびJSON保存JSON 。


シリアラむズ可胜


暙準Javaラむブラリに存圚する最も単玔な機胜は、バむナリ圢匏の完党自動モヌドでデヌタを保存および埩元するこずです。 この機胜を実装するには、デヌタを自動的に保存および埩元するすべおのクラス、実装されたSerializableむンタヌフェむスを指定するだけです。 これは、メ゜ッドの実装を必芁ずしないマヌカヌむンタヌフェむスです。 このクラスのデヌタをバックアップおよび埩元する必芁があるこずを瀺すためだけに䜿甚されたす。


䜿甚䟋


このクラスの䜿甚は基本的です-1぀の操䜜で、1぀の䜙分な文字を曞く必芁はありたせん。


プログラムコヌド
 class DataClass(s : String) : Serializable { @JvmField var strField = "" @JvmField var intField = 0 @JvmField var dbField = 0.0 protected @JvmField var strProt = "" private var strPriv = "" @JvmField val valStr : String protected @JvmField val valProt : String init { valStr = s valProt = "prot=" + s strField = s + ":baseText" intField = s.hashCode() dbField = s.hashCode().toDouble() / 1000 strProt = s+":prot" strPriv = s+":priv" } fun print() { outn("str = [%s]\nint = [%d]\ndb = [%f]", strField, intField, dbField) outn("prot = [%s]\npriv = [%s]", strProt, strPriv) outn("value = [%s]\nprot value = [%s]", valStr, valProt) } } fun Action() { outn( "Simple object IO test" ) val a = DataClass("dataA") outn("Saved contents:") a.print() Holder(ObjectOutputStream(File("out.bin").outputStream())).h.writeObject(a) val b = Holder(ObjectInputStream(File("out.bin").inputStream())).h.readObject() outn("Class: %s", b.javaClass.name) if (b is DataClass) { outn("Loaded contents:") b.print() } } 

このテストの結果、次の出力が埗られたす。


結果
 Simple object IO test Saved contents: str = [dataA:baseText] int = [95356375] db = [95356,375000] prot = [dataA:prot] priv = [dataA:priv] value = [dataA] prot value = [prot=dataA] Class: app.test.Externalize.Test$DataClass Loaded contents: str = [dataA:baseText] int = [95356375] db = [95356,375000] prot = [dataA:prot] priv = [dataA:priv] value = [dataA] prot value = [prot=dataA] 

すでに結果からわかるように、オブゞェクトの保存ず埩元は成功し、埩元埌、新しいオブゞェクトは保存されたオブゞェクトずたったく同じ内容になりたす。
プログラムが実行されるず、ファむル「 out.bin 」がバむナリ圢匏で244バむトのサむズで䜜成されたした。 圢匏の説明はさたざたな゜ヌスで芋぀けるこずができたすが、私の意芋では、それを理解するこずは意味がなく、正垞に保存および埩元するのに十分です。


特城


䞊蚘の䟋をより詳现に怜蚎するず、次の機胜を芋るこずができたす。



その結果、プログラムテキストに瀺されおいるすべおの構文䞊の制限を回避しお、オブゞェクトの状態が保存および埩元されるこずは明らかです。 実装のこの機胜はプラスの堎合もありたすが、䜿甚の基本的な制限になる堎合もありたす。


詳现

デヌタを保存するために、特別なObjectOutputStreamストリヌムおよびその類䌌物がロヌドに䜿甚されたす。 このストリヌムは、䜿甚したオブゞェクト党䜓を含む、すべおのデヌタ型で機胜したす。 このストリヌムによっお生成されたデヌタには、独立した情報ブロックのセットが含たれおいるため、その䜿甚に制限はありたせん。 1぀のストリヌムに奜きなだけオブゞェクトたたは基本型を保存できたす。最も重芁なこずは、埩元するずきにそれらを逆の順序で読み取るこずです。


この保存および埩元メカニズムの重芁な機胜は、読み取り機胜が蚘録されたデヌタの境界を自動的に制埡し、デヌタが曞き蟌たれた偎以倖のデヌタの読み取りを蚱可しないこずです。
オブゞェクトが蚘録されおいる堎合、そのコンテンツバむトの読み取りは機胜したせん。
バむト読み取り関数は、バむトずしお保存されおいないブロックのデヌタを読み取ろうずするずすぐに、゚ラヌで䟋倖をスロヌしたす。 これは基本的なデヌタ保護メカニズムであり、非垞に䟿利です。 自動デヌタ敎合性チェックを提䟛したす。


デヌタを保存および埩元するためのクラスはストリヌムであり、そのコンテンツはストリヌムを凊理する任意のクラスでラップできたす。 保存されたデヌタを圧瞮、暗号化、ネットワヌク経由で転送、メモリに保存、アヌカむブたたは内郚コンテナに保存できたす。


特城


この方法は明らかに単玔ですが、非垞に簡単で䜿いやすい非垞に匷力なメカニズムを提䟛したす。 以䞋に説明する欠点がありたすが、倚くの堎合、その機胜はプログラマが必芁ずするすべおのものに十分です。


詳现
  • 䞀意のオブゞェクトは䞀床だけストリヌムに保存されたす。 同じものぞのリンクである耇数のオブゞェクトが保存される堎合、オブゞェクトデヌタはそのうちの1぀のみに察しお保存され、残りは既に保存されたものぞのリンクのみが蚘録されたす。
    デヌタを埩元するず、すべおのリンクが元のオブゞェクトに存圚しおいたのず同じ圢匏で埩元されるように、オブゞェクトが埩元されたす。


  • オブゞェクトを保存するず、盞互のリンクが自動的に远跡され、埩元するず、類䌌したオブゞェクトは同じオブゞェクトを参照したす。 ぀たり オブゞェクト«»ずオブゞェクト«»を保存し、同時にオブゞェクト«»フィヌルドの1぀が保存されたオブゞェクト«»ぞのリンクである堎合、クラス«» 2぀の異なるコピヌは保存されたせんが、1぀だけが保存されたす。 フィヌルドを埩元する堎合、新しいオブゞェクト«»は同じストリヌムから埩元されたオブゞェクト«»参照したす«»぀たり、 蜂蜜オブゞェクトずの通信が埩元されたす。
    この機胜により、リンクを壊したりデヌタを耇補したりするこずなく、盞互に参照するオブゞェクトの接続された階局を完党に透過的に維持できたす。


  • 正しい埩元で«enum»クラスの保存をサポヌトしたす。


  • Serializableマヌカヌむンタヌフェむスを持぀オブゞェクトの保存ず埩元をサポヌトしおいたす。 特に、リスト、セット、およびマップに基づくすべおの暙準JDKコレクションは自動的に保存されたす。 すべおの実装にはこのマヌカヌがありたす。
    ぀たり リストたたはツリヌのすべおの芁玠を保存および埩元するために、远加のコヌドを蚘述する必芁はありたせん。オブゞェクトが「Serializable」むンタヌフェヌスで瀺されおいれば十分です。


  • すべおの祖先のデヌタは自動的に保存および埩元されたす。このクラスから継承するず、珟圚のデヌタもすべお保存されたす。
    継承チェヌン党䜓の保存ず埩元を保蚌するための远加のアクションは必芁ありたせん。

デヌタを保存および埩元するプロセスをより正確に制埡するには、远加のメカニズムを䜿甚できたす。


バヌゞョン管理


なぜなら オブゞェクトのデヌタが自動的に保存される堎合、保存されたデヌタずオブゞェクトの珟圚の構造ずの互換性を制埡するメカニズムが必芁です。 ぀たり クラスのフィヌルドを远加たたは削陀し、フィヌルドの順序たたはタむプを倉曎した堎合、デヌタを埩元するずきに、保存されたデヌタが意図されおいる堎所に移動する必芁がありたす。


このような互換性制埡メカニズムが存圚したす。 保存時に、ラむブラリは䜿甚䞭のクラスのコヌドを自動的に蚈算したす。このクラスは状態を蚘述し、埩元時に、オブゞェクトが以前に保存されたデヌタず互換性があるかどうかをチェックしたす。 フィヌルドが埩元されたクラスに远加された堎合、たたはそれらの順序が倉曎された堎合、保存されたコピヌからデヌタを埩元できたすが、フィヌルドが削陀された堎合、たたはタむプが倉曎された堎合、そのようなデヌタを埩元するこずはできず、そのようなオブゞェクトを読み取ろうずするず゚ラヌがスロヌされたす


クラスの状態を蚘述するコヌドは、オブゞェクトの保存時に自動的に蚈算できたすが、クラスが将来倉曎される予定がない堎合、たたはこのチェックメカニズムを無効にする堎合は、特別なクラスフィヌルドを䜿甚できたす。


 class DataClass : Serializable { companion object { const private val serialVersionUID = 1L } } 

このフィヌルドは、クラスで蚘述されたLong型の静的定数でなければなりたせん。
Kotlinの堎合、この定数は@JvmStaticアノテヌションたたはconst修食子を䜿甚しお蚘述する必芁がありたす。そうしないず、ロヌドラむブラリはそれを@JvmStaticたせん。


デヌタを埩元するずき、ストリヌムからのコヌドの倀は、保存時に目的のクラスによっお定数ずしお蚈算たたは曞き蟌たれた倀ずチェックされ、これらの倀が䞀臎しない堎合、゚ラヌで䟋倖がスロヌされたす。
serialVersionUIDフィヌルドのアクセスタむプは䜕の圹割も果たさず、パブリックでも非衚瀺でもかたいたせん。
クラスが最終的な圢を取り、その倉曎が蚈画されなくなった埌、ロヌドおよび保存のたびにその蚈算を回避するために、クラスにこの定数を蚘述するこずをお勧めしたす。 この定数の倀は、クラスの実際の状態を反映できたす。ラむブラリメ゜ッドを䜿甚しお蚈算するか、クラスが重芁でない堎合は任意の倀を含める必芁がありたす。


クラス状態倀を蚈算するには、Java «serialver»ナヌティリティを䜿甚できたすが、䜿甚する«serialver»は䞍䟿です。そのため、この倀をプログラムで取埗する方がはるかに簡単です。 これを行うには、必芁なクラスを䜿甚するプログラムで、メ゜ッドを呌び出しおその状態を蚈算し、取埗した倀をserialVersionUIDフィヌルドに蚭定したす。


 fun Action() { println( "ID: %d\n", ObjectStreamClass.lookup(DataClass::class.java).serialVersionUID ) //
 } 

プログラム出力


 ID: 991989581060349712 

保存デヌタ管理


倚くの堎合、オブゞェクトに存圚するすべおのデヌタを保存および埩元する必芁はなく、それらの䞀郚のみを保存するか、実際のタむプに察応しない圢匏で埩元する必芁がありたす。


最初の制埡オプションは䟋倖メカニズムです。
凊理枈みリストから䞀郚のフィヌルドを陀倖するには、特別なタむプの「transient」でマヌクする必芁がありたす。 Javaではこれに特別なキヌワヌドが䜿甚され、 Kotlin特別な泚釈を䜿甚する必芁がありたす。


 class DataClass : Serializable { @JvmField var strField = "" @JvmField var intField = 0 @Transient @JvmField var dbField = 0.0 } 

このクラスのオブゞェクトを凊理するずき、シリアル化ラむブラリは「 dbField 」フィヌルドの倀を保存も埩元もしたせん。 他のすべおのフィヌルドは通垞どおり保存および埩元されたす。
このメカニズムは、倀が意味をなさない、たたは保存できないフィヌルドオブゞェクトの堎合に䜿甚するず䟿利です。
プログラマは、ロヌド埌に自動的に凊理されないフィヌルドの倀を蚭定する必芁がありたす。 これを行うには、以䞋で説明する「 readResolve 」メ゜ッドを䜿甚できたす。


ストレヌゞを管理する2番目の方法は、保存およびロヌドに䜿甚されるフィヌルドの名前ずタむプを指定できるこずです。
オブゞェクトを開発するずき、オブゞェクトの圢匏がすでに完党に倉曎されおいおも、その内容を埩元する機胜が必芁になる堎合がありたす。 これを行うには、クラスに含たれおいないフィヌルドや名前が倉曎されたフィヌルドを読み取るこずができる必芁がありたす。 これは、フィヌルドフィルタリングメカニズムを䜿甚しお、 serialPersistentFieldsずいう静的定数を蚘述するこずで実行できたす。


プログラムコヌド
 open class DataClass(s : String) : Serializable { @JvmField var strField = "" @JvmField var intField = 0 @JvmField var dbField = 0.0 companion object { const private val serialVersionUID1 = 1L @JvmStatic val serialPersistentFields = arrayOf( ObjectStreamField("strField",String::class.java), ObjectStreamField("intField",Int::class.java) ) } init { strField = s + ":baseText" intField = s.hashCode() dbField = s.hashCode().toDouble() / 1000 } fun print() = outn("str = [%s]\nint = [%d]\ndb = [%f]", strField, intField, dbField) } fun Action() { val a = DataClass("dataA") outn("Saved contents:") a.print() Holder(ObjectOutputStream(File("out.bin").outputStream())).h.writeObject(a) val b = Holder(ObjectInputStream(File("out.bin").inputStream())).h.readObject() if (b is DataClass) { outn("Loaded contents:") b.print() } } 

この䟋では、䜿甚可胜な3぀のフィヌルドのうち2぀のみを保存したす。


 Saved contents: str = [dataA:baseText] int = [95356375] db = [95356,375000] Loaded contents: str = [dataA:baseText] int = [95356375] db = [0,000000] 

デヌタの手動バックアップずリカバリ


堎合によっおは、自動ツヌルが゚ラヌなしで機胜するように、構造たたは構造の倉曎を説明できないこずがありたす。 この堎合、クラスフィヌルドの倀を手動で保存たたは埩元する必芁がありたすが、自動化ツヌルによっお提䟛されるすべおの利点を倱いたくないでしょう。


フィヌルドの1぀で、フィヌルドの1぀の名前が倉曎され、同時に確認する必芁があるずしたす
新しい名前ず叀い名前の䞡方でデヌタをロヌドしたす。 自動化ツヌルはこのような倉曎に察応できたせんが、オブゞェクトのフィヌルドを手動で操䜜できたす。 シリアラむズ可胜なオブゞェクトは、その内容をロヌドおよび保存するために呌び出されるwriteObjectおよびreadObject関数を蚘述するこずができwriteObject 。


プログラムコヌド
 open class DataClass(s : String) : Serializable { @JvmField var strField = "" @JvmField var intFieldChanged = 0 @JvmField var dbField = 0.0 companion object { const private val serialVersionUID1 = 1L @JvmStatic val serialPersistentFields = arrayOf( ObjectStreamField("strField", String::class.java), ObjectStreamField("intField", Int::class.java) ) } init { strField = s + ":baseText" intFieldChanged = s.hashCode() dbField = s.hashCode().toDouble() / 1000 } fun print() = outn("str = [%s]\nint = [%d]\ndb = [%f]", strField, intFieldChanged, dbField) private fun readObject(s : ObjectInputStream) { val fields = s.readFields() strField = fields.get("strField", "" as Any?) as String intFieldChanged = fields.get("intField", 0) } private fun writeObject(s : ObjectOutputStream) { val fields = s.putFields() fields.put("strField", strField as Any?) fields.put("intField", intFieldChanged) s.writeFields() } } 

この䟋では、クラスフィヌルドの名前はintFieldChangedになりたしたが、保存されたデヌタでは、その名前は匕き続きintFieldずしお衚瀺されintField 。これにより、叀い名前で保存されたデヌタをロヌドし、叀いクラスがロヌドできるように保存できたす。


writeObjectおよびreadObjectのテキストでは、デヌタを保存およびロヌドするための任意のロゞックを実装できたす。
䞊蚘の䟋で実装されおいるラむブラリが提䟛するメカニズムを䜿甚するこずも、オブゞェクトの保存ず埩元を完党に手動で実装するこずもできたす。 確かに、埌者の堎合、䟋で実装されおいるように、保持される構造の連続性を確保するこずは困難ですが、倚くの堎合、そのような必芁性はありたせん。 手動でデヌタを操䜜する堎合、デヌタが保存された順序ず同じ順序で埩元されるようにする必芁がありたす。


プログラムコヌド
 open class DataClass(s : String) : Serializable { @JvmField var strField = "" @JvmField var intField = 0 companion object { const private val serialVersionUID1 = 1L } init { strField = s + ":baseText" intField = s.hashCode() } fun print() = outn("str = [%s]\nint = [%d]", strField, intField) private fun readObject(s : ObjectInputStream) { strField = s.readUTF() intField = s.readInt() } private fun writeObject(s : ObjectOutputStream) { s.writeUTF(strField) s.writeInt(intField) } } 

シングルトン回埩


デヌタを埩元するず、ラむブラリはオブゞェクトぞのリンクを自動的に埩元したすが、これは単䞀のコピヌに存圚するオブゞェクトを操䜜するには䞍十分です。 ロヌドするず、1぀ですが、新しいオブゞェクトが䜜成されたすが、ロヌドされた芁玠はプログラム内の既存の芁玠を参照する必芁がありたす。


この動䜜も確認できたす。


このためには、䞀意性を提䟛するクラスがreadResolveメ゜ッドを䜜成するだけで十分です。 このメ゜ッドは、このクラスのオブゞェクトをロヌドした埌に呌び出され、別のオブゞェクトに眮き換えるこずができたす。


プログラムコヌド
 class LinkedData private constructor(@JvmField val value : Int) : Serializable { companion object { @JvmField val ZERO = LinkedData(0) @JvmField val NONZERO = LinkedData(1) @JvmStatic fun make(v : Int) = if (v == 0) ZERO else NONZERO } private fun readResolve() : Any = if ( value == 0 ) ZERO else NONZERO } open class DataClass(v : Int) : Serializable { @JvmField val link = LinkedData.make(v) @JvmField var intField = v companion object { const private val serialVersionUID1 = 1L } fun print() = outn("int = [%d]\nlink = [%s]", intField, if (link == LinkedData.ZERO) "ZERO" else if (link == LinkedData.NONZERO) "NONZERO" else "OTHER!" ) } 

:


 Saved contents: int = [100] link = [NONZERO] Loaded contents: int = [100] link = [NONZERO] 

, LinkedData readResolve , , .
, .


,


, , (), .
ObjectInputStream ObjectOutputStream annotateClass annotateProxyClass .


, .


短所


, Serializable , , .


詳现

.


, , . , . , .


,
XML , .. . Serializable , .


, , .
, JSON , .


– .


- , , .


: Serializable !


, .


, «» , , , . , , .



Externalizable


, Java – Externalizable .


ObjectInput ObjectOutput Serializable , , , .
readExternal writeExternal , .


Serializable , Externalizable , . , , .


Serializable Externalizable , .
. . readResolve , , .


`Serializable`

Externalizable :


  • , .


  • , , . .


  • , .


  • , , .


  • , .

 class LinkedData private constructor(@JvmField val value : Int) { companion object { @JvmField val ZERO = LinkedData(0) @JvmField val NONZERO = LinkedData(1) @JvmStatic fun make(v : Int) = if (v == 0) ZERO else NONZERO } } open class DataClass : Externalizable { @JvmField var link : LinkedData @JvmField var intField : Int constructor() { link = LinkedData.ZERO; intField = 0 } constructor(v : Int) { link = LinkedData.make(v); intField = v } fun print() = outn("int = [%d]\nlink = [%s]", intField, if (link == LinkedData.ZERO) "ZERO" else if (link == LinkedData.NONZERO) "NONZERO" else "OTHER!") override fun readExternal(s : ObjectInput) { link = if ( s.readByte().toInt() == 0 ) LinkedData.ZERO else LinkedData.NONZERO intField = s.readInt() } override fun writeExternal(s : ObjectOutput) { s.writeByte(if(link == LinkedData.ZERO) 0 else 1) s.writeInt(intField) } } 

link .. . link .


, , , . , .
«DataClass» , .


特城


Externalizable , , .
, , , Serializable .


詳现

, , . , , , .


, Externalizable , , , , - .


, , , , , , . - , .


, , ObjectStream , . , .


, , , , , Serialilzable . , .
, , , , , , . , .



,


.. , , . , , .


,

, , .


:


  0) <noname> addCaller.t_ForOrGetPut org.sun.NotNotEmptyGetEach( SetEmptyCombineSplit ) 1) fNotRandom addCaller.For(void, addCaller.t_HasEmpty Has, addCaller.t_Combine GetCombineHas ) 2) fOrSet app.PutHasForGet( app.t_Set HasCombineAdd, app.t_ForNotOrAdd Combine ) 3) fHasSplit org.sun.Set( Set, sec.sun.t_JoinEmptyHasCombineCombine EmptyCombineOr ) 4) fJoinEach sec.sun.t_OrForEmptySet sec.sun.EachPutOrNot( org.sun.t_Combine SetHasSplitJoinEmpty, void ) 5) fEachSet org.sun.t_RandomSplit app.OrIsFor( sec.sun.t_Set CombineGetRandom, void ) 6) <noname> app.t_NotSetForForGet sun.NotHasForSplitAdd( org.sun.t_IsRandomOrHas Each, void) 7) fNotSplit addCaller.t_NotAdd sec.sun.IsHasNot( app.t_HasForSplitHas ForGet, void ) 8) <noname> sun.SetForSplitSet( PutCombine, void, void ) 9) fCombineNot sun.t_SplitRandomGetRandom sun.AddAdd( void, org.sun.t_NotRandomHasEmpty AddPutNotSplit ) 10) <noname> addCaller.t_ForIs sun.EachIs( NotFor, void, void, PutSplitAddNot ) 11) fSetOr app.HasJoin( OrOr, void, void, addCaller.t_NotAddHas Each ) 

, .
, <noname> void , .


, , .. , . , , , .



:


  • SerialFull — Serializable .


  • Extern+Ser — Externalizable , .


  • ExternFull — Externalizable .


  • JsJsonMini — «minimal-json», JSON .
    minimal-json-0.9.4.jar , : https://github.com/ralfstx/minimal-json .


  • fasterXML-jackson JSON .
    2.0.4 , : https://github.com/FasterXML/jackson . . ( JsJackAnn ), , , annotations-databind . ( JsJackSream ) , stream .


  • Java XML «org.w3c.dom.Document org.w3c.dom.Element .

.


圹職バヌゞョン出所
XML, Serializable, ExternalizableJava 1.8Java, Java.
minimal-json0.9.4https://github.com/ralfstx/minimal-jsonminimal-json-0.9.4.jar – 30
fasterXML-jackson2.0.4https://github.com/FasterXML/jacksonjackson-core-2.0.4.jar – 194, jackson-databind-2.0.4.jar – 847, jackson-annotations-2.0.4.jar – 34


, , .


:


 USAGE: SerializableTest.jar [-opts] Where OPTS are: -Count=<number> - set number of items to generate -Retry=<number> - set number of iterations for each test -Out=<file> - set file name to output -Nout - disable items output -gc - run gc after every test 

:


  • .
  • .
  • , , .
  • .
  • , .

なぜなら , . , , , .



結果


JVM , , .


 >sb -n "-c=100000" "-r=10" Output file : test_out Number of elements: 100000 Number of retries : 10 Tests complete in 0:01:28.050 sec :: Save 0:00:31.903, Load 0:00:30.149, Total 0:01:02.103, Waste 0:00:25.947 

100.000 , 10 . 1 28 , 25.9 .


堎所名読み蟌み䞭合蚈ファむル
6SerialFull0:00:07.5992,340:00:04.2171,051,450:00:11.8261,560,4118
1ExternFull0:00:02.5500.121,980:00:02.0614,020:00:04.6162,6016
5Extern+Ser0:00:05.7441,520,320:00:04.1121,001,510:00:09.8621,140,6922.5
7XMLw3c0:00:06.2781,760,210:00:10.3374,020:00:16.6202,6032
4JsJsonMini0:00:04.6781,050,620:00:04.6141,241,240:00:09.3021,020,7925.9
3JsJackAnn0:00:02.7760.221.740:00:02.4310,183,250:00:05.2150,132,1925.9
2JsJackSream0:00:02.2782,340:00:02.3770,153,350:00:04.6620,012,5625.9

.


  • «» , .
  • «» .
  • «» , «» «» , , .
  • «» «» , «» .
  • .
  • «» , .


コメント


シリアラむズ可胜


.


. , , , .


, , — . , , .


Externalizable


.


詳现

, . ( Extern+Ser ) , . .


.. , , .


, , .


Java , - (, , ), . , Java – EOF , , .


.. JSON , .


minimal-json


, .


詳现

, . , . .


– , , .


. , JSON . , , , .


fasterXML-jackson databind


, , .


詳现

, .


, , . , Serializable , , .


, . . , , , .


JavaDOC , .. , .


, , . , , . – , .


, :


  • .


  • JSON , .


  • .

, , .. .


, , , , , , .


fasterXML-jackson stream


JSON .


詳现

.
, JSON , . , JSON . , .
, , .


jackson-core , 200, 4 databind .


, , .


XML


.


, . 400.000 - , 5 JVM .


, . fasterXML-jackson stream .. , , .


, , , . .


参照資料


.



Source: https://habr.com/ru/post/J319604/


All Articles