我实际上认为你最好使用kryo(我不知道除了非二进制协议之外,提供较少模式定义的替代方案)。你提到泡菜不容易受到 kryo 在没有注册类的情况下得到的减速和膨胀的影响,但即使没有注册类,kryo 仍然比泡菜更快,更不臃肿。请参阅以下微基准测试(显然可以放心,但这是我可以轻松做到的):
蟒蛇泡菜
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-40ms(Kryo 1.04,Scala 2.9.1,Java 1.6.0.26热点JVM在64位Linux上)。为了进行比较,如果我注册类,它输出51个字节和18-25ms。
比较
Kryo在不注册类时使用大约40%的空间和3%的时间作为Python泡菜,在注册类时大约30%的空间和2%的时间。当您需要更多控制时,您始终可以编写自定义序列化程序。