如何序列化(使用 protobuf-net)另一个程序集(dll)中描述的对象字段?

How to serialize (using protobuf-net) a field that is the object described in another assembly (dll)?

我在我的项目中使用 Microsoft.CodeAnalysis.CSharp.dll。我有一个 class,这个 class 的 属性 是一个在 Microsoft.CodeAnalysis.CSharp.dll 中描述并连接到我的项目的对象.

[ProtoContract]
public class FunctionAnnotation : 
{
     [ProtoMember(1)] public IMethodSymbol Symbol { get; set; }
}

IMethodSymbol 描述在 Microsoft.CodeAnalysis.CSharp.dll.

我使用 protobuf-net。 当您尝试序列化一个对象时,它抛出一个异常:

No serializer defined for type: Microsoft.CodeAnalysis.IMetnodSymbol

很明显Microsoft.CodeAnalysis.Method.Symbol没有标记为[ProtoContract]

  private void Serialization()
    {
         string folderName = @"f:/serialization/";
         Directory.CreateDirectory(folderName);
         int name = this.Symbol.ToString().GetHashCode();
         using (FileStream fs = new FileStream("f:/serialization/" + name + ".dat", FileMode.OpenOrCreate))
         {
              Serializer.Serialize(fs, this);
         }
    }

标记现有 classes 的选项有哪些? 如何解决这个问题?

理论上您可以使用 RuntimeTypeModel API 手动配置外部类型,即

RuntimeTypeModel.Default.Add(typeof(SomeTYpe), false).Add("Member", 1); // etc

但是:如果外部类型是 DTO 样式的对象,这将最有效。如果它是一个复杂的领域对象,你最好单独引入一个 DTO 映射,即你控制的一组对象,代表你需要的 data,而不是实现。