gpt4 book ai didi

c# - "Type is not expected, and no contract can be inferred: Leap.Vector"错误。使用 Protobuf-net 序列化器

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:08 25 4
gpt4 key购买 nike

我正在开发一个使用跳跃运动设备并使用 C# 实现的应用程序,我的问题是我想在我的数据库中存储包含向量的列表。所以我考虑过将向量转换为 float 组的解决方案,问题是每个列表最多包含 300 个值,最少包含 300 个值(将其存储到数据库中需要花费大量时间)。

因此,我搜索了其他可能的存储方式,最终进入了 .net 序列化的主题。我曾尝试实现内置的 .net 序列化。认为它有效,但仍然需要大约一分钟的时间来序列化列表。因此,针对该主题提出的另一种解决方案是使用 protobuf-net。所以我尝试使用 nuget 包安装程序安装它。并以这个函数结束(从解决方案 Fastest way to serialize and deserialize .NET objects 复制)

public static byte[] Serialize(List<Vector> tData)
{
using (var ms = new MemoryStream())
{
ProtoBuf.Serializer.Serialize(ms, tData);
return ms.ToArray();
}
}

public static List<Vector> Deserialize(byte[] tData)
{
using (var ms = new MemoryStream(tData))
{
return ProtoBuf.Serializer.Deserialize<List<Vector>>(ms);
}
}

但是运行代码会导致我出现上述错误(标题)。

我认为错误将发生在:ProtoBuf.Serializer.Serialize(ms, tData);

最佳答案

@dbc 已经链接到类似的代码 re Point3D,但我想知道这里是否需要任何序列化器。这看起来很简单,只需要做原始的(注意我假设 float 是这里的基础数据类型;如果不是,只需更改所有 sizeof(float)float* 到正确的类型):

static unsafe byte[] Serialize(List<Vector> vectors)
{
var arr = new byte[3 * sizeof(float) * vectors.Count];
fixed(byte* ptr = arr)
{
var typed = (float*)ptr;
foreach(var vec in vectors)
{
*typed++ = vec.X;
*typed++ = vec.Y;
*typed++ = vec.Z;
}
}
return arr;
}
static unsafe List<Vector> Deserialize(byte[] arr)
{
int count = arr.Length / (3 * sizeof(float));
var vectors = new List<Vector>(count);
fixed (byte* ptr = arr)
{
var typed = (float*)ptr;
for(int i = 0; i < count; i++)
{
var x = *typed++;
var y = *typed++;
var z = *typed++;
vectors.Add(new Vector(x, y, z));
}
}
return vectors;
}

如果您真的勇敢,您也可以尝试直接转储底层数据,而不是手动复制字段;如果 sizeof(Vector) 恰好是 3 * sizeof(float)(或任何底层类型),那值得一试。

关于c# - "Type is not expected, and no contract can be inferred: Leap.Vector"错误。使用 Protobuf-net 序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45163315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com