我正在尝试使用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#中,我们在.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++中读取
我有一个List<object>不同类型的对象,如整数,字符串和自定义类型.所有自定义类型都是protobuf调整.我现在要做的是使用protobuf.net序列化/反序列化此列表.到目前为止,我怀疑我必须明确地声明每个类型,遗憾的是这些混合列表结构是不可能的.因为二元形成器没有问题做这些事情我希望我错过了一些东西,你可以帮助我.所以我的问题是如何处理protobuf.net中的对象.
使用Google Protocol Buffers,我可以为我编码的所有邮件设置最大大小吗?
如果我知道我编码的内容永远不会大于X字节,那么Google Protobuffs总会产生一个大小为Y的缓冲区,如果我给它一个较小的数据量,请将它填充到Y大小?
对于我的生活,我无法从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的第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) 如何让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]标记.我在函数中放了一个断点,但它没有被击中.这与此类序列化的方式有关吗?
在更新到最新的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上看到了SetFactory方法.但是,它似乎可以按类型提供.(和MethodInfo或字符串?我能听到Func<T>吗?)
我想要的是能够使用我的IoC容器的对象解析和构造能力进行所有反序列化.(我正在使用Autofac.)Protobuf-net应该首先尝试在任何构造上使用我的IoC.如果返回null,那么我想要默认行为.目前有办法做到这一点吗?谢谢你的时间.
我试图在网上找到一些建议,但找不到任何相关的建议.
假设我正在创建一个包含很多字段(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)
我在这里并没有考虑可读性,因为在反序列化以获得平坦数据或嵌套数据时存在利弊.我的问题是真正关注技术影响.