标签: protobuf-net

使用Protobuf-net将大数据文件作为IEnumerable流式传输

我正在尝试使用Protobuf-net来保存数据并将数据加载到磁盘但却卡住了.

我有一个我需要处理的资产组合,我希望能够尽快做到这一点.我已经可以从CSV读取,但使用二进制文件会更快,所以我正在研究Protobuf-Net.

我无法将所有资源都放入内存中,因此我想将它们流式传输,而不是将它们全部加载到内存中.

所以我需要做的是将一大组记录暴露为IEnumerable.这可能与Protobuf-Net有关吗?我已经尝试了几件事但却无法让它运行起来.

序列化似乎有效,但我无法再次读取它们,我得到0资产.有人能指出我正确的方向吗?查看了Serializer类中的方法,但找不到任何涵盖此案例的方法.我这个用例由Protobuf-net支持?我顺便使用V2.

提前致谢,

格特 - 扬

这是我尝试的一些示例代码:

public partial class MainWindow : Window {

    // Generate x Assets
    IEnumerable<Asset> GenerateAssets(int Count) {
        var rnd = new Random();
        for (int i = 1; i < Count; i++) {
            yield return new Asset {
                ID = i,
                EAD = i * 12345,
                LGD = (float)rnd.NextDouble(),
                PD = (float)rnd.NextDouble()
            };
        }
    }

    // write assets to file
    private void Write(string path, IEnumerable<Asset> assets){
        using (var file = File.Create(path)) …
Run Code Online (Sandbox Code Playgroud)

c# protobuf-net

7
推荐指数
1
解决办法
3259
查看次数

protobuf-net进入.proto会产生枚举冲突吗?

在C#中,我们在.proto中有命名空间,我们从protobuf-net获得,我们没有得到任何命名空间.所以问题是如何使用namespacs/packages生成protobuf-net生成(并使用内部).proto文件.

我们解析所有项目以生成.proto文件以将C++应用程序连接到我们的C#应用​​程序时的示例

enum AnimationCode {
   None = 0;
   Idle = 1;
   //...
}
Run Code Online (Sandbox Code Playgroud)

enum SessionCode {
   None = 0;
   //...
}
Run Code Online (Sandbox Code Playgroud)

因此,当我们将该统一项目.proto文件提供给protogen编译器时,我们得到了大量的

枚举类型"SessionStateCode"没有名为"None"的值.

请注意,枚举值使用C++作用域规则,这意味着枚举值是其类型的兄弟,而不是它的子级.

而且没有C++代码.

要点是这样,编码的C#消息至少可以从C++中读取

.net c# c++ protocol-buffers protobuf-net

7
推荐指数
1
解决办法
3585
查看次数

protobuf和List <object> - 如何序列化/反序列化?

我有一个List<object>不同类型的对象,如整数,字符串和自定义类型.所有自定义类型都是protobuf调整.我现在要做的是使用protobuf.net序列化/反序列化此列表.到目前为止,我怀疑我必须明确地声明每个类型,遗憾的是这些混合列表结构是不可能的.因为二元形成器没有问题做这些事情我希望我错过了一些东西,你可以帮助我.所以我的问题是如何处理protobuf.net中的对象.

c# protobuf-net .net-3.5

6
推荐指数
1
解决办法
8386
查看次数

Google Protocol Buffers - 固定大小的缓冲区?

使用Google Protocol Buffers,我可以为我编码的所有邮件设置最大大小吗?

如果我知道我编码的内容永远不会大于X字节,那么Google Protobuffs总会产生一个大小为Y的缓冲区,如果我给它一个较小的数据量,请将它填充到Y大小?

c# c++ protocol-buffers protobuf-net

6
推荐指数
1
解决办法
3227
查看次数

Protobuf-net反序列化开放街道地图

对于我的生活,我无法从Open Street Maps反序列化protobuf文件.

我试图反序列化以下提取:http://download.geofabrik.de/osm/north-america/us-northeast.osm.pbf以获取节点,我正在使用http://code.google.com/p/protobuf-net /作为图书馆.我试图反序列化一堆不同的对象,但它们都是null.

原型文件可以在这里找到:http://trac.openstreetmap.org/browser/applications/utils/export/osm2pgsql/protobuf

有什么建议?

protobuf-net openstreetmap

6
推荐指数
1
解决办法
4083
查看次数

在运行时ProtoBuf-net模型中是否允许<T>?

我正在使用ProtoBuf-net的第2版,目前我正在发出错误"无法确定成员:A"

当我们使用ClassOfType <T>时,是否可以为Protobuf-net创建运行时模型?如果是这样,有人可以在下面的代码中发现我缺少的东西吗?

顺便说一句:这个请求的模型是使用protobuf-net反序列化未知类型 我可以得到一个版本的这个很好......但是它们使用的是抽象基类,而不是T的泛型类.

这是一个工作示例(删除了无效的东西).

using System;
using System.IO;
using NUnit.Framework;
using ProtoBuf;
using ProtoBuf.Meta;

namespace ProtoBufTestA2
{
    [TestFixture]
    public class Tester
    {
        [Test]
        public void TestMsgBaseCreateModel()
        {
            var BM_SD = new Container<SomeDerived>();

            using (var o = BM_SD) {
                o.prop1 = 42;
                o.payload = new SomeDerived();
                using (var d = o.payload) {
                    d.SomeBaseProp = -42;
                    d.SomeDerivedProp = 62;
                }
            }

            var BM_SB = new Container<SomeBase>();
            using (var o = BM_SB) {
                o.prop1 = 42;
                o.payload = new SomeBase(); …
Run Code Online (Sandbox Code Playgroud)

.net c# protobuf-net

6
推荐指数
1
解决办法
984
查看次数

强制protobuf-net忽略IEnumerable/ICollection接口

如何让protobuf-net的v2忽略我的类实现ICollection,IEnumerable等的事实?

对于这种特殊情况,我只希望标记为[ProtoMember]的字段被序列化.


我目前正在使用protobuf-net v1转换为使用v2.我有一个特殊的结构,由于更改,现在正在序列化错误.它看起来像下面这样:

[ProtoContract]
public class FileTree : ICollection<FilePath>, IEnumerable<FilePath>, IEnumerable, INotifyCollectionChanged, INotifyPropertyChanged {

    private FileTreeNode _Root;

    [ProtoMember (1)]
    public FileTreeNode Root {
        get { return _Root; }
        set { _Root = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

编写FileTree类是为了将文件路径(如"C:\ happy.txt""C:\ history.txt")折叠成更像的东西

"C:\h"
???? "appy.txt"
???? "istory.txt"
Run Code Online (Sandbox Code Playgroud)

该结构消除了路径串中的冗余.所以,我真的不希望FileTree类通过IEnumerable函数被序列化,因为它只是存储为"C:\ happy.txt","C:\ history.txt"等.现在,在序列化中对于FileTree对象,每个路径都将完全打印出来.


编辑:我要提到的最后一件事 - 我在FileTree中有一个On_Deserialization函数,它用[ProtoAfterDeserialization]标记.我在函数中放了一个断点,但它没有被击中.这与此类序列化的方式有关吗?

c# wpf serialization .net-4.0 protobuf-net

6
推荐指数
1
解决办法
1230
查看次数

没有为protobuf-net中的System.Version定义序列化程序

在更新到最新的protobuf-net(2.0.0.601)后,我现在在尝试序列化System.Version类型的值时遇到异常.

[ProtoContract(SkipConstructor=true)]   
public class ServerLoginInfo
{
    [ProtoMember(1)]
    public Version ServerVersion { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这曾经在2.0.0.480中正常工作,没有做任何特殊的事情.

是否有可能让它在新版本中运行,或者是我回滚到旧版本的唯一选择?

(我还需要序列化/反序列化与旧的protobuf-net版本向后兼容.)

protobuf-net c#-4.0

6
推荐指数
1
解决办法
816
查看次数

我可以为Protobuf-net设置一个全局对象工厂吗?

我在Protobuf-net上看到了SetFactory方法.但是,它似乎可以按类型提供.(和MethodInfo或字符串?我能听到Func<T>吗?)

我想要的是能够使用我的IoC容器的对象解析和构造能力进行所有反序列化.(我正在使用Autofac.)Protobuf-net应该首先尝试在任何构造上使用我的IoC.如果返回null,那么我想要默认行为.目前有办法做到这一点吗?谢谢你的时间.

c# ioc-container protobuf-net deserialization

6
推荐指数
1
解决办法
500
查看次数

在protobuf消息或嵌套消息中有多个字段是最好的吗?

我试图在网上找到一些建议,但找不到任何相关的建议.

假设我正在创建一个包含很多字段(50+)的协议缓冲区消息.最好是将所有字段保持在同一级别还是将它们组织在子消息中?这种或那种方式对表演有什么影响吗?

例:

message myMessage{
 string field1 = 1;
 string field2 = 2;
 ....
 string fieldn = n;
}
Run Code Online (Sandbox Code Playgroud)

VS

message myMessage{
 SubMessage1 groupedfieldsbasedonsomebusinesslogic1 = 1;
 SubMessage2 groupedfieldsbasedonsomebusinesslogic2 = 2;

 message SubMessage1{
  string field1 = 1;
  string field2 = 2;
  ... 
  string fieldx = x;
 } 

 message SubMessage2{
  string fieldxplus1 = x+1;
  ... 
  string fieldn = n;
 }
}
Run Code Online (Sandbox Code Playgroud)

我在这里并没有考虑可读性,因为在反序列化以获得平坦数据或嵌套数据时存在利弊.我的问题是真正关注技术影响.

database-design data-modeling protocol-buffers protobuf-net

6
推荐指数
1
解决办法
981
查看次数