Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ProtoBuf Linq错误消息“源数据中的字段无效:0”_Linq_Protobuf Net - Fatal编程技术网

ProtoBuf Linq错误消息“源数据中的字段无效:0”

ProtoBuf Linq错误消息“源数据中的字段无效:0”,linq,protobuf-net,Linq,Protobuf Net,我在使用protobuf linq时遇到以下问题: using (var stream = new MemoryStream()) { SerializeMultiple(PrepareData(), stream); } private static void SerializeMultiple(IEnumerable<Person> persons, Stream stream) { foreach (var person in pers

我在使用protobuf linq时遇到以下问题:

using (var stream = new MemoryStream())
{
    SerializeMultiple(PrepareData(), stream);
}

private static void SerializeMultiple(IEnumerable<Person> persons, Stream stream)
{            
    foreach (var person in persons)
    {
        Serializer.Serialize(stream, person);
    }

    stream.Position = 0;

    var q = RuntimeTypeModel.Default.AsQueryable<Person>(stream,null);
    var results = from e in q
                  where e.Id % 2 == 0
                  select new { e.Id, e.Name };

    Console.WriteLine("first : " + results.First().Id);
    Console.ReadLine();
}

static IEnumerable<Person> PrepareData()
{
    for (int i = 0; i < (int) 1e+04; i++)
    {
        yield return new Person {Id = i, Name= "John" + i, Address = "Address" + i*i};
    }
}

[ProtoContract]
class Person
{
    [ProtoMember(1)]
    public int Id { get; set; }

    [ProtoMember(2)]
    public string Name { get; set; }

    [ProtoMember(3)]
    public string Address { get; set; }
}
AsQueryable行引发上述异常:

源数据中的字段无效:0


对这件事有什么想法吗?

这不是protobuf linq的错误。将项序列化到流中时,应使用SerializeWithLengthPrefix为每条消息的长度添加前缀,以允许将它们分开。默认情况下,protobuf linq使用PrefixStyle.Base128。在下面,您可以找到一个正确的代码片段:

      Serializer.SerializeWithLengthPrefix(stream, person, PrefixStyle.Base128);

我怀疑这是一个关于Scooletz protobuf linq作者的问题;我已经通过NuGetThanks对它们进行了ping,@Scooletz。另外,你能告诉我什么时候使用它合适吗DeserializeItems@GenaVerdel您的意思是什么时候使用protobuf linq,什么时候使用标准反序列化?如果是这样的话,如果只投影属性的一个子集,请使用protobuf linq,就像在您的案例中一样-跳过地址。跳过的属性越多,查询速度就越快。希望有帮助。