ProtoBuf Linq错误消息“源数据中的字段无效:0”
我在使用protobuf linq时遇到以下问题: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
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,就像在您的案例中一样-跳过地址。跳过的属性越多,查询速度就越快。希望有帮助。