Я действительно думаю, что вам лучше всего использовать kryo (я не знаю альтернатив, которые предлагают меньше схем, отличных от недвоичных протоколов).Вы упоминаете, что рассол не подвержен замедлению и раздутию, которое крио получает без регистрации классов, но крио все еще быстрее и менее раздуто, чем рассол, даже без регистрации классов.Посмотрите на следующий микропроцессор (очевидно, что он взят с крошкой соли, но это то, что я мог бы легко сделать):
Python pickle
import pickle
import time
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
people = [Person("Alex", 20), Person("Barbara", 25), Person("Charles", 30), Person("David", 35), Person("Emily", 40)]
for i in xrange(10000):
output = pickle.dumps(people, -1)
if i == 0: print len(output)
start_time = time.time()
for i in xrange(10000):
output = pickle.dumps(people, -1)
print time.time() - start_time
Выводит 174 байта и 1.18-1.23секунд для меня (Python 2.7.1 в 64-битном Linux)
Scala kryo
import com.esotericsoftware.kryo._
import java.io._
class Person(val name: String, val age: Int)
object MyApp extends App {
val people = Array(new Person("Alex", 20), new Person("Barbara", 25), new Person("Charles", 30), new Person("David", 35), new Person("Emily", 40))
val kryo = new Kryo
kryo.setRegistrationOptional(true)
val buffer = new ObjectBuffer(kryo)
for (i <- 0 until 10000) {
val output = new ByteArrayOutputStream
buffer.writeObject(output, people)
if (i == 0) println(output.size)
}
val startTime = System.nanoTime
for (i <- 0 until 10000) {
val output = new ByteArrayOutputStream
buffer.writeObject(output, people)
}
println((System.nanoTime - startTime) / 1e9)
}
Выводит мне 68 байт и 30-40 мс (Kryo 1.04, Scala 2.9.1, Java1.6.0.26 горячая точка JVM в 64-битном Linux).Для сравнения выводятся 51 байт и 18-25 мс, если я регистрирую классы.
Сравнение
Kryo использует около 40% пространства и 3% времени в качестве Python pickle, когда не регистрируетсяклассы, и около 30% пространства и 2% времени при регистрации классов.И вы всегда можете написать собственный сериализатор, когда вам нужно больше контроля.