我一直在阅读documentation的protobuf-net属性,但我并不精通protobuf规范。
我在MVC项目中使用它,在反序列化期间,DbGeography是空的。
public class Foo
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2, AsReference = true)]
public DbGeography Location { get; set; }
}
这是我班级目前的样子,我尝试使用DynamicType
& IsRequired
,无论如何都没有用。而不是试图猜测/混合&匹配,我希望有人做过类似的事情。
我在环顾四周时看到的最近的事情是这个项目有一个自定义reader和writer,它使用protobuf作为空间数据类型,但它是一个自定义类。
public class Foo
{
[ProtoMember(1)]
public int Id { get; set; }
[ProtoMember(2, DynamicType= true)] //<-- this works
public DbGeography Location { get; set; }
}
但我仍然想知道标记这些成员的最佳方式是什么,例如性能与尺寸权衡
[ProtoContract]
public class Foo
{
[ProtoMember(1)]
public int Id { get; set; }
public string Address { get; set; }
[ProtoMember(2, AsReference = true)]
public DbGeography Location { get; set; }
[ProtoMember(8, AsReference = true)] //<-- What is the cost of using this for List<Bar>? since im using a non-primitive type
public List<Bar> Bars { get; set; }
}
答案 0 :(得分:0)
重新更新:
[ProtoMember(2, DynamicType= true)] //<-- this works
我不建议。至于正确要做的事情;我会推荐一种代理类型:
[ProtoContract]
sealed class DbGeographyPoco
{
[ProtoMember(1)]
public string Value { get; set; }
public static implicit operator DbGeographyPoco(DbGeography value)
{
return value == null ? null : new DbGeographyPoco {
Value = value.WellKnownValue.WellKnownText };
}
public static implicit operator DbGeography(DbGeographyPoco value)
{
return value == null ? null : DbGeography.FromText(value.Value);
}
}
然后您可以通过以下方式在应用启动期间注册某个地方:
RuntimeTypeModel.Default.Add(typeof(DbGeography),false)
.SetSurrogate(typeof(DbGeographyPoco));