C# protobuf网络子消息读取不正确
我目前正在测试protobuf-net(最新版本),但在反序列化时间歇性地出现“子消息未正确读取”异常。到目前为止,还没有明显的模式来重现这个错误,数据总是一样的 我在谷歌上搜索了这个错误,到目前为止,人们只在处理大数据(>20MB)时报告了这个错误,而我没有这样做 有人能指出这是否是一个bug(如果是,有什么可能的解决方案来修复/规避它吗?),还是我遗漏了一些步骤?下面是我正在使用的代码:C# protobuf网络子消息读取不正确,c#,exception,protobuf-net,C#,Exception,Protobuf Net,我目前正在测试protobuf-net(最新版本),但在反序列化时间歇性地出现“子消息未正确读取”异常。到目前为止,还没有明显的模式来重现这个错误,数据总是一样的 我在谷歌上搜索了这个错误,到目前为止,人们只在处理大数据(>20MB)时报告了这个错误,而我没有这样做 有人能指出这是否是一个bug(如果是,有什么可能的解决方案来修复/规避它吗?),还是我遗漏了一些步骤?下面是我正在使用的代码: using System; using System.Collections.Generic; usin
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using ProtoBuf;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
const string message = "Cycle {0}: {1:N2} ms - avg: {2:N2} ms - min: {3:N2} - max: {4:N2}";
const int loop = 1000;
var counter = new Stopwatch();
var average = 0d;
var min = double.MaxValue;
var max = double.MinValue;
for (int i = 0;; i++)
{
var classThree = Create();
counter.Reset();
counter.Start();
Parallel.For(0, loop, j =>
{
using (var ms = new MemoryStream())
{
Serializer.Serialize(ms, classThree);
using (var ms2 = new MemoryStream(ms.ToArray()))
{
var des = Serializer.Deserialize<ClassThree>(ms2);
var aaa = des;
}
}
});
counter.Stop();
var elapsed = counter.Elapsed.TotalMilliseconds;
average += elapsed;
min = Math.Min(min, elapsed);
max = Math.Max(max, elapsed);
var currentAverage = average / (i + 1);
Console.Clear();
Console.WriteLine(message, i, elapsed, currentAverage, min, max);
Thread.Sleep(0);
}
}
private static ClassThree Create()
{
var classOne = new ClassSix()
{
// properties
p_i1 = -123,
p_i2 = 456,
p_l1 = -456,
p_l2 = 123,
p_s = "str",
p_f = 12.34f,
p_d = 56.78d,
p_bl = true,
p_dt = DateTime.Now.AddMonths(-1),
p_m = 90.12m,
p_b1 = 12,
p_b2 = -34,
p_c = 'c',
p_s1 = -21,
p_s2 = 43,
p_ts = new TimeSpan(12, 34, 56),
p_id = Guid.NewGuid(),
p_uri = new Uri("http://www.google.com"),
p_ba = new[] { (byte)1, (byte)3, (byte)2 },
p_t = typeof(ClassTwo),
p_sa = new[] { "aaa", "bbb", "ccc" },
p_ia = new[] { 7, 4, 9 },
p_e1 = EnumOne.Three,
p_e2 = EnumTwo.One | EnumTwo.Two,
p_list = new List<ClassFive>(new[]
{
new ClassFive()
{
i = 1,
s = "1"
},
new ClassFive()
{
i = 2,
s = "2"
}
}),
// fields
f_i1 = -123,
f_i2 = 456,
f_l1 = -456,
f_l2 = 123,
f_s = "str",
f_f = 12.34f,
f_d = 56.78d,
f_bl = true,
f_dt = DateTime.Now.AddMonths(-1),
f_m = 90.12m,
f_b1 = 12,
f_b2 = -34,
f_c = 'c',
f_s1 = -21,
f_s2 = 43,
f_ts = new TimeSpan(12, 34, 56),
f_id = Guid.NewGuid(),
f_uri = new Uri("http://www.google.com"),
f_ba = new[] { (byte)1, (byte)3, (byte)2 },
f_t = typeof(ClassTwo),
f_sa = new[] { "aaa", "bbb", "ccc" },
f_ia = new[] { 7, 4, 9 },
f_e1 = EnumOne.Three,
f_e2 = EnumTwo.One | EnumTwo.Two,
f_list = new List<ClassFive>(new[]
{
new ClassFive()
{
i = 1,
s = "1"
},
new ClassFive()
{
i = 2,
s = "2"
}
})
};
var classThree = new ClassThree()
{
ss = "333",
one = classOne,
two = classOne
};
return classThree;
}
}
public enum EnumOne
{
One = 1,
Two = 2,
Three = 3
}
[Flags]
public enum EnumTwo
{
One = 1,
Two = 2,
Three = 4
}
[ProtoContract, ProtoInclude(51, typeof(ClassSix))]
public class ClassOne
{
// properties
[ProtoMember(1)]
public int p_i1 { set; get; }
[ProtoMember(2)]
public uint p_i2 { set; get; }
[ProtoMember(3)]
public long p_l1 { set; get; }
[ProtoMember(4)]
public ulong p_l2 { set; get; }
[ProtoMember(5)]
public string p_s { set; get; }
[ProtoMember(6)]
public float p_f { set; get; }
[ProtoMember(7)]
public double p_d { set; get; }
[ProtoMember(8)]
public bool p_bl { set; get; }
[ProtoMember(9)]
public DateTime p_dt { set; get; }
[ProtoMember(10)]
public decimal p_m { set; get; }
[ProtoMember(11)]
public byte p_b1 { set; get; }
[ProtoMember(12)]
public sbyte p_b2 { set; get; }
[ProtoMember(13)]
public char p_c { set; get; }
[ProtoMember(14)]
public short p_s1 { set; get; }
[ProtoMember(15)]
public ushort p_s2 { set; get; }
[ProtoMember(16)]
public TimeSpan p_ts { set; get; }
[ProtoMember(17)]
public Guid p_id { set; get; }
[ProtoMember(18)]
public Uri p_uri { set; get; }
[ProtoMember(19)]
public byte[] p_ba { set; get; }
[ProtoMember(20)]
public Type p_t { set; get; }
[ProtoMember(21)]
public string[] p_sa { set; get; }
[ProtoMember(22)]
public int[] p_ia { set; get; }
[ProtoMember(23)]
public EnumOne p_e1 { set; get; }
[ProtoMember(24)]
public EnumTwo p_e2 { set; get; }
[ProtoMember(25)]
public List<ClassFive> p_list { set; get; }
// fields
[ProtoMember(26)]
public int f_i1 = 0;
[ProtoMember(27)]
public uint f_i2 = 0;
[ProtoMember(28)]
public long f_l1 = 0L;
[ProtoMember(29)]
public ulong f_l2 = 0UL;
[ProtoMember(30)]
public string f_s = string.Empty;
[ProtoMember(31)]
public float f_f = 0f;
[ProtoMember(32)]
public double f_d = 0d;
[ProtoMember(33)]
public bool f_bl = false;
[ProtoMember(34)]
public DateTime f_dt = DateTime.MinValue;
[ProtoMember(35)]
public decimal f_m = 0m;
[ProtoMember(36)]
public byte f_b1 = 0;
[ProtoMember(37)]
public sbyte f_b2 = 0;
[ProtoMember(38)]
public char f_c = (char)0;
[ProtoMember(39)]
public short f_s1 = 0;
[ProtoMember(40)]
public ushort f_s2 = 0;
[ProtoMember(41)]
public TimeSpan f_ts = TimeSpan.Zero;
[ProtoMember(42)]
public Guid f_id = Guid.Empty;
[ProtoMember(43)]
public Uri f_uri = null;
[ProtoMember(44)]
public byte[] f_ba = null;
[ProtoMember(45)]
public Type f_t = null;
[ProtoMember(46)]
public string[] f_sa = null;
[ProtoMember(47)]
public int[] f_ia = null;
[ProtoMember(48)]
public EnumOne f_e1 = 0;
[ProtoMember(49)]
public EnumTwo f_e2 = 0;
[ProtoMember(50)]
public List<ClassFive> f_list = null;
}
[ProtoContract]
public class ClassSix : ClassOne
{
}
[ProtoContract]
public class ClassTwo
{
}
[ProtoContract]
public interface IClass
{
[ProtoMember(1)]
string ss
{
set;
get;
}
[ProtoMember(2)]
ClassOne one
{
set;
get;
}
}
[ProtoContract]
public class ClassThree : IClass
{
[ProtoMember(1)]
public string ss { set; get; }
[ProtoMember(2)]
public ClassOne one { set; get; }
[ProtoMember(3)]
public ClassSix two { set; get; }
}
[ProtoContract]
public class ClassFour
{
[ProtoMember(1)]
public string ss { set; get; }
[ProtoMember(2)]
public ClassOne one { set; get; }
}
[ProtoContract]
public class ClassFive
{
[ProtoMember(1)]
public int i { set; get; }
[ProtoMember(2)]
public string s { set; get; }
}
}
使用系统;
使用System.Collections.Generic;
使用系统诊断;
使用System.IO;
使用系统线程;
使用System.Threading.Tasks;
使用ProtoBuf;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
const string message=“Cycle{0}:{1:N2}ms-avg:{2:N2}ms-min:{3:N2}-max:{4:N2}”;
const int loop=1000;
var计数器=新秒表();
var平均值=0d;
var min=double.MaxValue;
var max=double.MinValue;
对于(int i=0;i++)
{
var classThree=Create();
计数器重置();
counter.Start();
Parallel.For(0,循环,j=>
{
使用(var ms=new MemoryStream())
{
Serializer.Serialize(ms,class3);
使用(var ms2=newmemoryStream(ms.ToArray()))
{
var des=序列化程序。反序列化(ms2);
var aaa=des;
}
}
});
计数器。停止();
var已用=计数器。已用。总毫秒数;
平均+=已用时间;
最小值=数学最小值(最小值,经过时间);
最大值=数学最大值(最大值,已用时间);
var currentAverage=平均值/(i+1);
Console.Clear();
Console.WriteLine(消息、i、经过时间、当前平均值、最小值、最大值);
睡眠(0);
}
}
私有静态类三Create()
{
var classOne=new ClassSix()
{
//性质
p_i1=-123,
p_i2=456,
p_l1=-456,
p_l2=123,
p_s=“str”,
p_f=12.34f,
p_d=56.78d,
p_bl=真,
p_dt=DateTime.Now.AddMonths(-1),
p_m=90.12m,
p_b1=12,
p_b2=-34,
p_c='c',
p_s1=-21,
p_s2=43,
p_ts=新的时间跨度(12,34,56),
p_id=Guid.NewGuid(),
p_uri=新uri(“http://www.google.com"),
p_ba=new[]{(字节)1,(字节)3,(字节)2},
p_t=类型(第二类),
p_sa=新[]{“aaa”、“bbb”、“ccc”},
p_ia=new[]{7,4,9},
p_e1=1.3,
p_e2=EnumTwo.One | EnumTwo.Two,
p_列表=新列表(新[]
{
新第五类()
{
i=1,
s=“1”
},
新第五类()
{
i=2,
s=“2”
}
}),
//田地
f_i1=-123,
f_i2=456,
f_l1=-456,
f_l2=123,
f_s=“str”,
f_f=12.34f,
f_d=56.78d,
f_bl=真,
f_dt=DateTime.Now.AddMonths(-1),
f_m=90.12米,
f_b1=12,
f_b2=-34,
f_c='c',
f_s1=-21,
f_s2=43,
f_ts=新的时间跨度(12,34,56),
f_id=Guid.NewGuid(),
f_uri=新uri(“http://www.google.com"),
f_ba=new[]{(字节)1,(字节)3,(字节)2},
f_t=类型(第二类),
f_sa=新[]{“aaa”、“bbb”、“ccc”},
f_ia=新的[]{7,4,9},
f_e1=1.3,
f_e2=EnumTwo.One | EnumTwo.Two,
f_列表=新列表(新[]
{
新第五类()
{
i=1,
s=“1”
},
新第五类()
{
i=2,
s=“2”
}
})
};
var classThree=新的classThree()
{
ss=“333”,
一=一级,
二=一级
};
返回三级;
}
}
公共枚举枚举一
{
1=1,
二等于二,
三=3
}
[旗帜]
公共枚举枚举2
{
1=1,
二等于二,
三=4
}
[ProtoContract,ProtoInclude(51,typeof(Class6))]
公共一级
{
//性质
[原成员(1)]
公共int p_i1{set;get;}
[原成员(2)]
公共单元p_i2{set;get;}
[原成员(3)]
公共长p_l1{set;get;}
[原成员(4)]
公共ulong p_l2{set;get;}
[原成员(5)]
公共字符串p_s{set;get;}
[原成员(6)]
公共浮点p_f{set;get;}
[原成员(7)]
公共双p_d{set;get;}
[原成员(8)]
公共布尔p_bl{set;get;}
[原成员(9)]
公共日期时间p_dt{set;get;