可以从内存中将avros反序列化为Scala案例类,但为什么不从文件中反序列化?记录不能转换为案例类?

时间:2012-08-30 07:56:49

标签: scala serialization avro salat

我正在尝试使用Salat-Avro序列化和反序列化Scala案例类。

我可以在内存中序列化和反序列化,但我只能序列化到文件;我还不能反序列化表单文件。

为什么我的DatumReader在读取文件时不会像从流中读取时那样成功?

[error] (run-main) java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
at Main.main(salat-avro-example.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
Caused by: java.lang.ClassCastException: org.apache.avro.generic.GenericData$Record cannot be cast to models.Record
at Main$.<init>(salat-avro-example.scala:55)
at Main$.<clinit>(salat-avro-example.scala)
at Main.main(salat-avro-example.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
java.lang.RuntimeException: Nonzero exit code: 1
at scala.sys.package$.error(package.scala:27)
[error] {file:/home/julianpeeters/salat-avro-example/}default-7321ab/compile:run: Nonzero exit code: 1
[error] Total time: 18 s, completed Aug 30, 2012 12:04:01 AM

以下是代码:

val obj2 = grater[Record].asObjectFromDataFile(infile)

调用:

lazy val asDatumReader: AvroDatumReader[X] = asGenericDatumReader
lazy val asGenericDatumReader: AvroGenericDatumReader[X] = new AvroGenericDatumReader[X](asAvroSchema)def asObjectFromDataFile(infile: File): X = {
val asDataFileReader: DataFileReader[X] = new DataFileReader[X](infile, asDatumReader)
asDataFileReader.next()

}`

代码也可以在Github.com上看到:Salat-Avro-Example.scala和                                          Salat-Avro.avrograter.scala

我该如何解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:0)

现在我看到dataFileReader.next返回了一条记录,但字段的值仍然是UTF-8,我需要将值解组为带有applyValues的scala对象。像下面的hackish一样对我有用:

 val objIterator = asDataFileReader.asScala
                                  .iterator
                                  .map(i => asGenericDatumReader.applyValues(i.asInstanceOf[GenericData.Record]).asInstanceOf[X])