C# 使用Protobuf net将大型数据文件流式传输为IEnumerable

C# 使用Protobuf net将大型数据文件流式传输为IEnumerable,c#,protobuf-net,C#,Protobuf Net,我正试图使用Protobuf net来保存数据并将其加载到磁盘,但被卡住了 我有一个需要处理的资产组合,我希望能够尽快处理。我已经可以读取CSV文件,但使用二进制文件会更快,所以我正在研究Protobuf Net 我无法将所有资产放入内存,所以我希望将它们流式处理,而不是将它们全部加载到内存中 所以我需要做的是将一大组记录作为IEnumerable公开。Protobuf网络是否可以实现这一点?我试过几次,但都没能成功 序列化似乎有效,但我无法再次读取它们,我得到了0个资产。有人能给我指一下正确的

我正试图使用Protobuf net来保存数据并将其加载到磁盘,但被卡住了

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

我无法将所有资产放入内存,所以我希望将它们流式处理,而不是将它们全部加载到内存中

所以我需要做的是将一大组记录作为IEnumerable公开。Protobuf网络是否可以实现这一点?我试过几次,但都没能成功

序列化似乎有效,但我无法再次读取它们,我得到了0个资产。有人能给我指一下正确的方向吗?查看了
序列化程序
类中的方法,但找不到任何涉及此情况的方法。我知道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)) {
            Serializer.Serialize<IEnumerable<Asset>>(file, assets);
        }
    }

    // read assets from file
    IEnumerable<Asset> Read(string path) {
        using (var file = File.OpenRead(path)) {
            return Serializer.DeserializeItems<Asset>(file, PrefixStyle.None, -1);
        }
    }

    // try it 
    private void Test() {
        Write("Data.bin", GenerateAssets(100)); // this creates a file with binary gibberish that I assume are the assets
        var x = Read("Data.bin");
        MessageBox.Show(x.Count().ToString()); // returns 0 instead of 100
    }

    public MainWindow() {
        InitializeComponent();
    }

    private void button2_Click(object sender, RoutedEventArgs e) {
        Test();
    }
}

[ProtoContract]
class Asset {

    [ProtoMember(1)]
    public int ID { get; set; }

    [ProtoMember(2)]
    public double EAD { get; set; }

    [ProtoMember(3)]
    public float LGD { get; set; }

    [ProtoMember(4)]
    public float PD { get; set; }
}
公共部分类主窗口:窗口{
//生成x资产
IEnumerable生成集(整数计数){
var rnd=新随机数();
对于(int i=1;i
找到了答案。要反序列化,请使用PrefixBase.Base128

现在它就像一个符咒

GJ

使用(var file=file.Create(“Data.bin”)){
序列化(文件,生成(10));
}
使用(var file=file.OpenRead(“Data.bin”)){
var ps=Serializer.DeserializeItems(文件,PrefixStyle.Base128,1);
int i=ps.Count();//全部取回:-)
}

很抱歉,我帮不上忙-还有几天。很高兴你找到了答案。不用担心,不用花很长时间。非常感谢你(重新)写了整件事!
        using (var file = File.Create("Data.bin")) {
            Serializer.Serialize<IEnumerable<Asset>>(file, Generate(10));
        }

        using (var file = File.OpenRead("Data.bin")) {
            var ps = Serializer.DeserializeItems<Asset>(file, PrefixStyle.Base128, 1);
            int i = ps.Count(); // got them all back :-)
        }