我之前发布了一个关于Protobuf-Net的相关但仍然不同的问题,所以这里是:
我想知道是否有人(特别是Marc)可以评论下列哪一项最有可能更快:
(a)我目前将序列化的内置数据类型存储在二进制文件中.具体来说,长(8字节)和2浮点(2x4字节).其中每3个后来组成一个反序列化状态的对象.long类型表示DateTimeTicks以进行查找.我使用二进制搜索来查找数据请求的开始和结束位置.然后,一种方法在一个块(从开始到结束位置)下载数据,知道每个块由许多上述三元组(1个长整数,1个浮点数,1个浮点数)组成,并且每个三元组总是16个字节长.因此,检索到的三元组数总是(endLocation - startLocation)/ 16.然后我迭代检索到的字节数组,反序列化(使用BitConverter)每个内置类型,然后实例化一个由三元组构成的新对象,并将对象存储在列表中以供进一步处理.
(b)做以下事情会更快吗?构建一个单独的文件(或实现一个头),作为查找目的的索引.然后我不会存储内置类型的单个二进制版本,而是使用Protbuf-net来序列化上述对象的列表(= int的三元组,浮点数,浮点数作为对象的源).每个List都包含确切且总是一天的数据(记住,long表示DateTimeTick).显然,每个List的大小都会有所不同,因此我想为索引查找生成另一个文件或标题,因为每个数据读取请求只会请求整天的多天.当我想要检索一天的序列化列表时,我会简单地查找索引,读取字节数组,使用Protobuf-Net反序列化并且已经拥有我的对象列表.我想为什么我要问的是因为我不完全理解protobuf-net中的集合的反序列化是如何工作的.
为了更好地了解数据的大小,每个二进制文件大约3GB,因此包含数百万个序列化对象.每个文件包含大约1000天的数据.每个数据请求可以请求任意数量的当天数据.
您认为原始处理时间更快?我想在可能编写大量代码来实现之前获取一些输入(b),我目前有(a)并且能够在我的机器上每秒处理大约150万个对象(进程=从数据请求到返回的反序列化列表对象).
简介:我问的是二进制数据是否可以更快地读取I/O并使用方法(a)或(b)进行反序列化.
我得到了Protobuf-net的源代码,它将一个对象序列化为一个文件.
var person = new Person {
Id = 12345, Name = "Fred",
Address = new Address {
Line1 = "Flat 1",
Line2 = "The Meadows"
}
};
using (var file = File.Create("person.bin")) {
ProtoBuf.Serializer.Serialize(file, person);
}
Run Code Online (Sandbox Code Playgroud)
但是假设我有两个Person实例,我想将其序列化为单个文件.我怎样才能做到这一点?
我正在计划一个应用程序,其中服务器端将用 C# 编写,客户端将使用phonegap 创建
该应用程序大量使用使用 protobuf-net 库序列化的二进制文件。
假设我有一个 C# 对象
public class Foo
{
private string FooProp;
}
Run Code Online (Sandbox Code Playgroud)
并且该对象被序列化并使用phonegap传输到客户端。是否可以反序列化phonegap中生成的二进制文件并使用Javascript访问phonegap中的这些属性?
C# Publisher 正在使用“writeDelimitedTo”API 通过套接字以自定义 protobuff 格式发布连续市场数据消息。我必须阅读 C++ 中的所有消息并将其反序列化。下面是我的代码。由于 C++ 没有“parseDelimitedFrom”,因此在经过本论坛的多个建议后,编写了如下代码。
现在我的问题是 - 参考下面的代码,如果第一条消息大小小于 1024,那么在第一次迭代中,我将拥有第一条消息的完整流和第二条消息的部分流。反序列化第一条消息后,如何从套接字读取第二条消息的剩余流并将其与我在上一次迭代中读取的流合并?
试图通过以下方式在mac上安装protobuf:
brew install protobuf
Run Code Online (Sandbox Code Playgroud)
结果是:
Error: The `brew link` step did not complete successfully
The formula built, but is not symlinked into /usr/local
Could not symlink include/google
/usr/local/include is not writable.
Run Code Online (Sandbox Code Playgroud)
建议:
You can try again using:
brew link protobuf
Run Code Online (Sandbox Code Playgroud)
结果是:
Error: Could not symlink include/google
/usr/local/include is not writable.
Run Code Online (Sandbox Code Playgroud)
尝试:
brew update
brew uninstall protobuf... brew install protobuf
sudo brew... of course won't work (cowards...)
Run Code Online (Sandbox Code Playgroud)
任何的想法?
问题:在反序列化从Redis接收的字节时面临性能下降.
我正在使用REDIS在我的ASP.NET Web应用程序中分发缓存.
为了与我的应用程序中的Redis交谈,我正在使用StackExchange.Redis.
为了序列化/反序列化从/向DTO接收/从服务器接收的字节,我使用的是protobuf-net
我的目标是将100,000个用户的字典(Dictionary(int,User))存储到Redis中,并在单个请求中多次检索它.
该字典将驻留在MyContext.Current.Users属性下.该字典的键是用户ID,值是完整的dto.我现在面临的问题是,从字节反序列化100,000个用户需要1.5-2秒(Redis给我字节).我必须在我的请求中多次使用该属性.
public Dictionary<int, User> Users
{
get
{
// Get users from Redis cache.
// Save it in Redis cache if it is not there before and then get it.
}
}
Run Code Online (Sandbox Code Playgroud)
用户是在我的上下文包装器类中公开的属性.
这是我为用户提供的DTO(此DTO拥有超过100个属性):
[ProtoContract]
public class User
{
[ProtoMember(1)]
public string UserName { get; set; }
[ProtoMember(2)]
public string UserID { get; set; }
[ProtoMember(3)]
public string FirstName { get; set; }
.
.
. …Run Code Online (Sandbox Code Playgroud) 遵循有关如何使用protobuf-net和Protobuf-net以及Unity3D类型序列化不可变的封闭类型的答案之后,我尝试实现可处理UnityEngine的Vector3容器的序列化程序,其中唯一重要的值是Vector3.x,Vector3。 y和Vector3.z:
使用以下TypeModel:
serializer = TypeModel.Create();
serializer.UseImplicitZeroDefaults = false;
Run Code Online (Sandbox Code Playgroud)
然后,我尝试了两种不同的方法,分别为Vector3添加协议定义。明确的定义:
serializer.Add(typeof(Vector3), false).Add(1, "x").Add(2, "y").Add(3, "z");
Run Code Online (Sandbox Code Playgroud)
并使用代理:
serializer.Add(typeof(Vector3), false).SetSurrogate(typeof(SurrogateVector3));
Run Code Online (Sandbox Code Playgroud)
与代理类:
[ProtoContract]
public sealed class SurrogateVector3
{
[ProtoMember(1)]
float x;
[ProtoMember(2)]
float y;
[ProtoMember(3)]
float z;
public SurrogateVector3()
{}
public SurrogateVector3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
}
public static implicit operator Vector3(SurrogateVector3 v)
{
return new Vector3(v.x, v.y, v.z);
}
public static implicit operator SurrogateVector3(Vector3 v)
{ …Run Code Online (Sandbox Code Playgroud) c# serialization protocol-buffers protobuf-net unity-game-engine
我需要.net core 2.0上的谷歌协议缓冲区.我知道.net core 2.0上没有正式的google proto缓冲区实现,但是protobuf-net可以移植到.net core 2.0吗?
我尝试自己移植它,我看到该库使用的AppDomain.CurrentDomain.DefineDynamicAssembly尚未移植到.net核心.
另外.net WEBAPIController如何使用google协议缓冲区?