更新到最新版本的protobuf-net(2.4.0(后,事情不再起作用:
System.InvalidOperationException: 它是 无法为以下对象准备序列化程序:查询容器
多年来,2.0.0.668 版一切正常,似乎适用于 2.2.1 版,但 2.3.0 及更高版本会导致此问题。
什么改变了,或者我从来没有做对过什么?:-(我构建了一个小的重现,结果是:
无法为以下对象准备序列化程序:ProtoRepro.Program+QueryContainer InnerException:Type 不能表示为默认值:System.Collections.Generic.KeyValuePair'2[[ProtoRepro.Program+Query, ProtoRepro, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Double, System.Private.CoreLib, version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]
using ProtoBuf;
using ProtoBuf.Meta;
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace ProtoRepro {
internal class Program {
private static void Main(string[] args) {
try {
RuntimeTypeModel.Default[typeof(QueryContainer)].CompileInPlace();
// we get here with version 2.2.1 and lower
Console.WriteLine("Everything is fine!");
} catch (InvalidOperationException ioex) {
Console.Write(ioex.ToString());
} catch (NotSupportedException nsex) {
Console.Write(nsex.ToString());
}
}
[Serializable, ProtoContract]
public class QueryContainer {
private QueryContainer() { }
[ProtoMember(1, OverwriteList = true)]
public Dictionary<string, KeyValuePair<Query, double>> QueryAndWeightPerVariable { get; protected set; }
}
[Serializable, ProtoContract]
public class Query {
[ProtoMember(1)]
public QueryValue QueryValue { get; set; }
protected Query() { }
public Query(QueryValue queryValue) {
QueryValue = queryValue;
}
}
[Serializable, ProtoContract]
public class QueryValue {
[ProtoMember(1)]
public object Value { get; set; }
protected QueryValue() { }
public QueryValue(object value) {
Value = value;
}
}
}
}
我将不得不设置一个本地测试来深入了解它,但这里的更改很有可能与"映射"行为有关。因此,您可以尝试添加
[ProtoMap(DisableMap = true)]
到字典成员。如果这是一个猜测,我深表歉意(特别是如果我错了!(,但深入研究它必须等到我有时间。在 GitHub 上将其记录为问题也可能很有用。