Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.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
C# 获得';引用跟踪对象在反序列化期间更改了引用';例外_C#_.net_Protobuf Net - Fatal编程技术网

C# 获得';引用跟踪对象在反序列化期间更改了引用';例外

C# 获得';引用跟踪对象在反序列化期间更改了引用';例外,c#,.net,protobuf-net,C#,.net,Protobuf Net,这个问题与这个问题有关: 由于上面的帖子已经关闭,我创建了一个新的帖子,其中包含用于重现问题和异常堆栈跟踪的测试代码 这里发生了什么,为什么会出错?此外,我不清楚的标签上的原型包括。如果标记等于ProtoMember,那么我会得到一个关于重复字段号的异常。所以,我通常将其设置为max(ProtoMember标记)+1。这是工具所期望的吗 我使用svn(今天下载)的最新代码运行这个示例 谢谢 [ProtoContract] [ProtoInclude(6, typeof(B))] public c

这个问题与这个问题有关:

由于上面的帖子已经关闭,我创建了一个新的帖子,其中包含用于重现问题和异常堆栈跟踪的测试代码

这里发生了什么,为什么会出错?此外,我不清楚的标签上的原型包括。如果标记等于ProtoMember,那么我会得到一个关于重复字段号的异常。所以,我通常将其设置为max(ProtoMember标记)+1。这是工具所期望的吗

我使用svn(今天下载)的最新代码运行这个示例

谢谢

[ProtoContract]
[ProtoInclude(6, typeof(B))]
public class A
{
  [ProtoMember(1)]
  public int Property1 { get; set; }

  [ProtoMember(2)]
  public int? Property2 { get; set; }

  [ProtoMember(3)]
  public int Property3 { get; set; }

  [ProtoMember(4, DynamicType = true)]
  public object Property4 { get; set; }

  [ProtoMember(5, DynamicType = true)]
  public object Property5 { get; set; }

  public override bool Equals(object obj)
  {
    A a = obj as A;
    if (a == null)
      return false;

    return a.Property1 == this.Property1
           && a.Property2 == this.Property2
           && a.Property3 == this.Property3
           && Object.Equals(a.Property4, this.Property4)
           && Object.Equals(a.Property5, this.Property5);
  }
}

public class B: A
{
  [ProtoMember(1)]
  public string Property6 { get; set; }

  public override bool Equals(object obj)
  {
    B b = obj as B;
    if (b == null)
      return false;

    return b.Property6 == this.Property6 && base.Equals(obj);
  }
}

[Test]
public void TestProtoBuf2()
{
  IList<A> list = new List<A>
                    {
                      new A {Property1 = 1, Property2 = 1, Property3 = 200, Property4 = "Test1", Property5 = DateTime.Now},
                      new B {Property1 = 2, Property2 = 2, Property3 = 400, Property4 = "Test2", Property5 = DateTime.Now, Property6 = "yyyy"},
                      new A {Property1 = 3, Property2 = 3, Property3 = 600, Property4 = "Test3", Property5 = new Decimal(200)},
                    };
  using (var file = new FileStream("list.bin", FileMode.Create))
  {
    Serializer.Serialize(file, list);
  }

  IList<A> list2;
  using (var file = File.OpenRead("list.bin"))
  {
    list2 = Serializer.Deserialize<IList<A>>(file);
  }

  Assert.AreEqual(list.Count, list2.Count);

  for (int i = 0; i < list.Count; i++)
  {
    Assert.AreEqual(list[i], list2[i]);
  }
}

重新设置字段编号;它们需要在单个类型中是唯一的;不要求它是“max+1”-它们不必是连续的-但是,较小的数字更可取(只要它们是正的),因为“varint”编码可以更有效地打包低字段号(用于报头)


重新考虑参考跟踪问题;这是一个bug,在当前主干中已修复-谢谢;一个边缘案例,但已修复。

我找出了代码,似乎是因为DateTime值是一个结构,所以出现了问题。基本上,在ReadNetObject中,DateTime值被初始化为时间的开始,然后在反序列化后其值发生变化,代码认为它更改了引用,并在第442行的BclHelper.cs中爆炸出来。从我看到的是,您试图使用“1 stop属性”来包含所有不同的数据。你是否可以用特定的类型而不是对象来创建一个类,并且它仍然在继续?是的,这是真的。出于各种原因,我不得不这样做(节省内存,这会使编码更简单)。我还指定它是一个动态类型,我注意到proto-buf将类型信息放在其中。我可以创建3个成员,ValueAsDecimal、ValueAsString和ValueAsDateTime,但我不想这样做。@MarcGravel:据你所知,这只是一个附带问题,protobuf net的v2是否用于生产环境?thx@costa是的,很多;包括这里的stackoverflow。我不要求人们注册应用程序,但我知道在工业、旅游、医药、游戏和一般领域有许多积极的v2应用business@costa哦,你在拉后备箱?很好-很高兴它成功了是的。我还将运行自己的测试,以确保我序列化的内容在反序列化后返回。
at ProtoBuf.BclHelpers.ReadNetObject(Object value, ProtoReader source, Int32 key, Type type, NetObjectOptions options) in BclHelpers.cs: line 444
at ProtoBuf.Serializers.NetObjectSerializer.Read(Object value, ProtoReader source) in C:\Development\dotnet\protobuf-net\protobuf-net\Serializers\NetObjectSerializer.cs: line 37
at ProtoBuf.Serializers.TagDecorator.Read(Object value, ProtoReader source) in C:\Development\dotnet\protobuf-net\protobuf-net\Serializers\TagDecorator.cs: line 61
at ProtoBuf.Serializers.PropertyDecorator.Read(Object value, ProtoReader source) in C:\Development\dotnet\protobuf-net\protobuf-net\Serializers\PropertyDecorator.cs: line 53
at ProtoBuf.Serializers.TypeSerializer.Read(Object value, ProtoReader source) in TypeSerializer.cs: line 200
at ProtoBuf.Meta.RuntimeTypeModel.Deserialize(Int32 key, Object value, ProtoReader source) in C:\Development\dotnet\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs: line 418
at ProtoBuf.Meta.TypeModel.TryDeserializeAuxiliaryType(ProtoReader reader, DataFormat format, Int32 tag, Type type, ref Object value, Boolean skipOtherFields, Boolean asListItem, Boolean autoCreate, Boolean insideList) in C:\Development\dotnet\protobuf-net\protobuf-net\Meta\TypeModel.cs: line 895
at ProtoBuf.Meta.TypeModel.TryDeserializeList(ProtoReader reader, DataFormat format, Int32 tag, Type listType, Type itemType, ref Object value) in C:\Development\dotnet\protobuf-net\protobuf-net\Meta\TypeModel.cs: line 712
at ProtoBuf.Meta.TypeModel.TryDeserializeAuxiliaryType(ProtoReader reader, DataFormat format, Int32 tag, Type type, ref Object value, Boolean skipOtherFields, Boolean asListItem, Boolean autoCreate, Boolean insideList) in C:\Development\dotnet\protobuf-net\protobuf-net\Meta\TypeModel.cs: line 851
at ProtoBuf.Meta.TypeModel.DeserializeCore(ProtoReader reader, Type type, Object value, Boolean noAutoCreate) in C:\Development\dotnet\protobuf-net\protobuf-net\Meta\TypeModel.cs: line 594
at ProtoBuf.Meta.TypeModel.Deserialize(Stream source, Object value, Type type, SerializationContext context) in C:\Development\dotnet\protobuf-net\protobuf-net\Meta\TypeModel.cs: line 518
at ProtoBuf.Meta.TypeModel.Deserialize(Stream source, Object value, Type type) in C:\Development\dotnet\protobuf-net\protobuf-net\Meta\TypeModel.cs: line 500
at ProtoBuf.Serializer.Deserialize(Stream source) in C:\Development\dotnet\protobuf-net\protobuf-net\Serializer.cs: line 69