我正在使用 protobuf-net v2 并且有一个类继承了我不想序列化/克隆的“列表”。
当我调用“DeepClone”(或反序列化)时,克隆对象为空。我可以将对象序列化为文件,它似乎按预期序列化,但 RuntimeTypeModel 无法从字节 [] 反序列化它。
我发现解决这个问题的唯一解决方案是使用代理。
如前所述,如果您跳过“SetSurrogate”,则克隆失败。有没有其他选择来解决它?
随附的:
class Program
{
static void Main(string[] args)
{
RuntimeTypeModel model = RuntimeTypeModel.Create();
model[typeof(Custom<string>)].SetSurrogate(typeof(Surrogate<string>));
var original = new Custom<string> { "C#" };
var clone = (Custom<string>)model.DeepClone(original);
Debug.Assert(clone.Count == original.Count);
}
}
[ProtoContract(IgnoreListHandling = true)]
public class Custom<T> : List<T> { }
[ProtoContract]
class Surrogate<T>
{
public static implicit operator Custom<T>(Surrogate<T> surrogate)
{
Custom<T> original = new Custom<T>();
original.AddRange(surrogate.Pieces);
return original;
}
public static implicit operator Surrogate<T>(Custom<T> original)
{
return original == null ? null : new Surrogate<T> { Pieces = original };
}
[ProtoMember(1)]
internal List<T> Pieces { get; set; }
}
我发现的另一件事是,当您将“Custom”类中的 ProtoContract 属性替换为“System.Serializable”属性时,即使没有代理项,它也会按预期反序列化 byte[]。