【问题标题】:Deserialize a Byte Array created in C# in Python在 Python 中反序列化在 C# 中创建的字节数组
【发布时间】:2015-02-01 08:35:29
【问题描述】:

我在 C# 中有一个 2D 锯齿形双精度数组,我将其转换为这样的字节数组:

byte[][][] byteArray = new byte[10][][];

我以这种方式将字节数组保存为二进制文件:

BinaryFormatter formatter = new BinaryFormatter();
using (FileStream stream = new FileStream(path, FileMode.Create, FileAccess.Write))
{
   formatter.Serialize(stream, byteArray);
}

现在,我需要读取python 中的文件,以便在那里重新构建二维双数组...

我正在尝试使用numpy.fromfile(),并想知道应该如何做到这一点。

【问题讨论】:

  • 很确定 BinaryFormatter 在序列化对象的方式上是专有的。您很可能需要查看您输入的内容以及文件的写入方式。然后编写一个自定义 python 工具来读取该文件。只有当它只写入字节而不是一堆元数据时。

标签: c# python binary deserialization


【解决方案1】:

据我所知,BinaryFormatternumpy.fromfile() 不适合跨平台,更不用说跨语言了。使用更跨平台的格式会更容易,比如 JSON。将double 转换为byte[] 的部分也可能存在问题,例如因为字节序。如果性能和数据要求不是真正的问题,那么事情不会复杂化会更容易。

此示例使用Json.NET 表示 C#:

double[][] myArray = // whatever

var path = // whatever
using (StreamWriter file = File.CreateText(path))
{
    JsonSerializer serializer = new JsonSerializer();
    serializer.Serialize(file, myArray);
}

然后在 Python 中你所要做的就是:

import numpy
import json
path = # whatever
with open(path) as f:
    myArray = numpy.array(json.load(f))
# we now have the array! e.g.
print(myArray.dtype) # float64
print(myArray[0][0]) # 0.79449418131

【讨论】:

  • 谢谢 Tim S。还有一个问题。然后如何像双数组一样打开像这样创建的文件?
  • 我想我有它:using (StreamReader stream = new StreamReader(path)) { string strArray = stream.ReadToEnd(); myArray = JsonConvert.DeserializeObject<double[][]>(strArray); }
  • 是的,这行得通。您可以按照james.newtonking.com/json/help/html/… 的示例跳过中间string(类似于我在序列化时跳过任何中间字符串的方式)。我会推荐这个,因为它应该可以提供更好的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2018-07-26
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
相关资源
最近更新 更多