序列化层中scala结构类型的替代方案

序列化层中scala结构类型的替代方案,scala,serialization,avro,Scala,Serialization,Avro,在解决当前项目中的序列化层时,我偶然发现了Scala结构类型。我用它来构建这个层,在这个层中,scala类是通过Avro模式自动生成的,这要归功于。当然,我的目的不是为我们需要处理的每个实体同时编写序列化程序和反序列化程序。因此,在第一次尝试中,考虑到这是我使用Scala的第一个严肃项目,我最终得到了如下代码: object AvroSer { type AvroEntity = { def getSchema(): org.apache.avro.Schema } def seri

在解决当前项目中的序列化层时,我偶然发现了Scala结构类型。我用它来构建这个层,在这个层中,scala类是通过Avro模式自动生成的,这要归功于。当然,我的目的不是为我们需要处理的每个实体同时编写序列化程序和反序列化程序。因此,在第一次尝试中,考虑到这是我使用Scala的第一个严肃项目,我最终得到了如下代码:

object AvroSer {

  type AvroEntity = { def getSchema(): org.apache.avro.Schema }

  def serialize[T <: AvroEntity](entity: T)(implicit m: Manifest[T]): Array[Byte] = {
    val baos = new ByteArrayOutputStream
    val datumWriter = new SpecificDatumWriter(m.erasure.asInstanceOf[Class[T]])
    val dataFileWriter = new DataFileWriter(datumWriter)
    dataFileWriter.create(entity.getSchema, baos)
    dataFileWriter.append(entity)
    dataFileWriter.close()
    baos.toByteArray
  }

  def deserialize[T <: AvroEntity](bytes: Array[Byte], entityClass: Class[T])(implicit m: Manifest[T]): T = {
    val is = new SeekableByteArrayInput(bytes)
    val datumReader = new SpecificDatumReader(m.erasure.asInstanceOf[Class[T]])
    val dataFileReader = new DataFileReader(is, datumReader)
    dataFileReader.next()
  }

}
objectavroser{
键入AvroEntity={def getSchema():org.apache.avro.Schema}

def serialize[T挑剔:结构类型更像是duck类型的反面。后者说“我不在乎类型是什么,只要我可以访问这些成员”。前者说“我正在定义一个具有这些成员的特定类型,任何具有这些成员的其他类型都应该适合此类型”.重要的是要意识到差异,以免自焚。明白。我已经编辑了问题,删除了所有与duck打字相关的内容。谢谢。