2013-09-24 78 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