使用Protobuf.net实现内存流元组(锯齿数组)的序列化

本文关键字:数组 序列化 元组 net Protobuf 实现 内存 使用 | 更新日期: 2023-09-27 18:11:57

是否有可能序列化由binarywriter使用Protobuf.net创建的内存流元组?如果我这样做,Protobuf说它不能序列化一个流。

我要序列化的是一个锯齿数组元组。我不想把它们转换成一维数组,因为我认为没有必要。因此,我认为我将自己序列化锯齿数组到内存流,但我希望Protobuf.net为我序列化元组。我需要尽快完成整个序列化/反序列化。

编辑:

我的总体目标是通过WCF尽可能快地发送以下锯齿数组元组,无论如何。from jagged array to jagged array计数的总时间。

// F# interactive code
#time "on"
#r @"d:'Protobuf'protobuf-net.dll"
let getJaggedArray () =
  let size = 100
  let rnd = System.Random 1
  Array.init size (fun i ->
    Array.init size (fun j ->
      Array.init size (fun k ->
        rnd.NextDouble() )))
let wcfData = (getJaggedArray (), getJaggedArray ()), getJaggedArray ()
let file = new System.IO.FileStream ("test.bin", System.IO.FileMode.Create)
ProtoBuf.Serializer.Serialize (file, wcfData)
file.Close()
// === Future use ===
//[<ServiceContract>]
//type IWCF =
//  
//  [<OperationContract>]
//  [<ProtoBehavior>]
//  abstract Send: wcfData -> unit

使用Protobuf.net实现内存流元组(锯齿数组)的序列化

Protobuf-net目前没有任何特定的流处理(尽管它将处理byte[]),尽管我猜它可以简单地消耗Stream(序列化)并复制MemoryStream(反序列化)。如果您不想更改您的模型,应该可以为Stream注册一个"代理",它只需要几行代码就可以做到这一点(如果您感兴趣,请告诉我)。

它对大多数常见的"元组"模式都有自动支持,但是锯齿数据又是一个问题——尽管同样,如果我们确实需要的话,可以处理(更常见的是,拥有一个外部列表的对象本身具有内部列表是一个实用的解决"锯齿"的方法,并且目前有效)。

如果你能张贴一个更完整的(理想情况下可运行)的例子,我可能能够提供更多的指导。