如何序列化(使用 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,而不是实现。
我在我的项目中使用 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,而不是实现。