Non ho confrontato i buffer di protocollo con la serializzazione nativa di Java in termini di velocità, ma per l'interoperabilità la serializzazione nativa di Java è un no-no serio. Inoltre, nella maggior parte dei casi non sarà altrettanto efficiente in termini di spazio come buffer di protocollo. Certo, è un po 'più flessibile in termini di ciò che può memorizzare, e in termini di riferimenti ecc. Il protocollo Buffer è molto buono per quello a cui è destinato e quando soddisfa le tue necessità è fantastico - ma ci sono ovvie restrizioni dovute all'interoperabilità (e altre cose).
Recentemente ho pubblicato un framework di benchmarking di Protocol Buffers in Java e .NET. La versione Java è nello main Google project (nello), la versione .NET è my C# port project. Se si desidera confrontare la velocità PB con la velocità di serializzazione Java, è possibile scrivere classi simili e confrontarle. Se sei interessato all'interop, però, non darei seriamente la serializzazione Java nativa (o la serializzazione binaria nativa .NET).
Non ci sono altre opzioni per la serializzazione interoperabili oltre buffer protocollo però - Thrift, JSON e YAML vengono in mente, e ci sono senza dubbio gli altri.
MODIFICA: Va bene, se l'interoperabilità non è così importante, vale la pena cercare di elencare le diverse qualità che si desidera da un framework di serializzazione. Una cosa che dovresti pensare è il controllo delle versioni - questa è un'altra cosa che PB è progettata per gestire bene, sia a ritroso che a termine (quindi il nuovo software può leggere i vecchi dati e viceversa) - quando ti attieni alle regole suggerite, ovviamente :)
Avendo provato a essere cauto riguardo la serializzazione Java performance vs nativa, non sarei davvero sorpreso di scoprire che PB era comunque più veloce. Se si ha la possibilità, utilizzare il server VM: i miei benchmark recenti hanno mostrato che la VM del server è con una velocità doppia rispetto a durante la serializzazione e la deserializzazione dei dati di esempio. Penso che il codice PB si adatti molto bene al JIT del server VM :)
Proprio come le cifre di esempio, serializzando e deserializzando due messaggi (uno 228 byte, un 84750 byte) ho ottenuto questi risultati sul mio portatile usando il server VM:
Benchmarking benchmarks.GoogleSize$SizeMessage1 with file google_message1.dat
Serialize to byte string: 2581851 iterations in 30.16s; 18.613789MB/s
Serialize to byte array: 2583547 iterations in 29.842s; 18.824497MB/s
Serialize to memory stream: 2210320 iterations in 30.125s; 15.953759MB/s
Deserialize from byte string: 3356517 iterations in 30.088s; 24.256632MB/s
Deserialize from byte array: 3356517 iterations in 29.958s; 24.361889MB/s
Deserialize from memory stream: 2618821 iterations in 29.821s; 19.094952MB/s
Benchmarking benchmarks.GoogleSpeed$SpeedMessage1 with file google_message1.dat
Serialize to byte string: 17068518 iterations in 29.978s; 123.802124MB/s
Serialize to byte array: 17520066 iterations in 30.043s; 126.802376MB/s
Serialize to memory stream: 7736665 iterations in 30.076s; 55.93307MB/s
Deserialize from byte string: 16123669 iterations in 30.073s; 116.57947MB/s
Deserialize from byte array: 16082453 iterations in 30.109s; 116.14243MB/s
Deserialize from memory stream: 7496968 iterations in 30.03s; 54.283176MB/s
Benchmarking benchmarks.GoogleSize$SizeMessage2 with file google_message2.dat
Serialize to byte string: 6266 iterations in 30.034s; 16.826494MB/s
Serialize to byte array: 6246 iterations in 30.027s; 16.776697MB/s
Serialize to memory stream: 6042 iterations in 29.916s; 16.288969MB/s
Deserialize from byte string: 4675 iterations in 29.819s; 12.644595MB/s
Deserialize from byte array: 4694 iterations in 30.093s; 12.580387MB/s
Deserialize from memory stream: 4544 iterations in 29.579s; 12.389998MB/s
Benchmarking benchmarks.GoogleSpeed$SpeedMessage2 with file google_message2.dat
Serialize to byte string: 39562 iterations in 30.055s; 106.16416MB/s
Serialize to byte array: 39715 iterations in 30.178s; 106.14035MB/s
Serialize to memory stream: 34161 iterations in 30.032s; 91.74085MB/s
Deserialize from byte string: 36934 iterations in 29.794s; 99.98019MB/s
Deserialize from byte array: 37191 iterations in 29.915s; 100.26867MB/s
Deserialize from memory stream: 36237 iterations in 29.846s; 97.92251MB/s
La "velocità" rispetto a "dimensione" indica se il codice generato è ottimizzato per la velocità o la dimensione del codice. (I dati serializzati sono gli stessi in entrambi i casi. La versione "size" è fornita per il caso in cui hai molti messaggi definiti e non vuoi prendere molta memoria per il codice.)
Come si può vedere, per il messaggio più piccolo può essere molto veloce - oltre 500 piccoli messaggi serializzati o deserializzati per millisecondo. Anche con il messaggio 87K ci vuole meno di un millisecondo per messaggio.
Confronto di prestazioni completo di diversi formati di serializzazione - http://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/ – Maxim
so questa è una vecchia domanda, ma esiste un progetto Benchmark https://github.com/eishay/jvm-serializers/wiki dedicato alla serializzazione java. – kromit