2013-09-24 24 views
0

我需要实现一项功能,该功能会将从外部设备接收的数据包记录到文件中。稍后,应使用此文件重播此数据以模拟设备。无法将所有数据保存在内存中,因此我需要逐包处理数据。将多个对象同步到scala中的单个(人类可读的)文件

我正在寻找一种序列化机制,它支持将一个未知数量的数据包添加到文件中,然后再逐个数据包地重新加载它。理想的输出是人可读的,例如, JSON,但这不是必须的。

我已经看过scala酸洗,但我想我需要内存中的所有数据。除手动执行此操作外,是否有更好/更简单的方法?使用google protobuf或任何相关的库可以处理这种流处理?

+0

你的数据包是嵌套还是扁平结构? –

+0

数据包通常包含数字和数字列表。我不确定你的意思是嵌套。如果您想到这一点,数据包不能包含在其他数据包内。 – user1587480

+0

我的意思是数据包可以有它的所有原始字段(平坦),并可能有一些像帐户一样的字段,这反过来将拥有它自己的字段。我在问,因为如果你拥有所有原始的字段集合,它们非常容易和自然的将它们存储为csv。 –

回答

0

为什么不使用组合器并将数据存储在JSON文件中?

E.g.解析JSON(看来你也有类似的结构):

import scala.util.parsing.combinator._ 
class JSON extends JavaTokenParsers { 
    def value: Parser[Any] = obj | arr | stringLiteral | 
          floatingPointNumber | "null" | "true" | "false" 
    def obj:  Parser[Any] = "{"~repsep(member, ",")~"}" 
    def arr:  Parser[Any] = "["~repsep(value, ",")~"]" 
    def member: Parser[Any] = stringLiteral~":"~value 
} 

然后通过加载JSON从这些文件重播:

import java.io.FileReader 
object ParseJSON extends JSON { 
    def main(args: Array[String]) { 
    val reader = new FileReader(args(0)) 
    // parseAll is overloaded: takes sequence or input reader as a second argument 
    println(parseAll(value, reader)) 
    } 
} 

从斯卡拉SE编程实例。

+0

我不得不手动写出JSON,因为我不能在内存中拥有整个对象列表。后来我不得不手动将它映射回scala对象。如果可能,我想跳过这些步骤,让图书馆为我做。 – user1587480