I am using Protobuf-net to replace my DataContractSerializer
, but is it possible to send other object types like Color
, Size
, Point
and maybe more? Because this is possible with the DataContractSerializer
. I could not find it in the documentation.
问问题
462 次
1 回答
2
首先,请注意很多类型可以作为“元组”自动处理;例如,我希望System.Windows.Point
能正常工作,因为它只有一个X
and Y
,而且它有一个构造函数接受x
and y
。不幸的是,System.Drawing.Point
has X
, Y
and , 以及一个接受andIsEmpty
的构造函数,所以它不能自动推断出正确的处理- 但我试图说明的一点(哈哈)是:一些外部类型无需任何额外的工作就可以工作.x
y
System.Drawing.Point
对于其余部分,有多种方法可以使用RuntimeTypeModel
API 来解决域模型之外的类型问题。根据具体类型,可以:
- 告诉它您希望它如何根据其成员序列化该类型
- 为该类型写一个代理(使用适当的转换运算符),并告诉它代理
例如:
RuntimeTypeModel.Default.Add(typeof(System.Drawing.Point), false)
.Add("X", "Y");
它配置X
为字段 1,Y
作为字段 2。代理方法对于复杂的场景更有用,但作为一个简单的例子:
[ProtoContract]
public class PointDto
{
[ProtoMember(1)] public int X { get; set; }
[ProtoMember(2)] public int Y { get; set; }
public static implicit operator System.Drawing.Point(PointDto value)
{
return value == null
? System.Drawing.Point.Empty
: new System.Drawing.Point(value.X, value.Y);
}
public static implicit operator PointDto(System.Drawing.Point value)
{
return new PointDto { X = value.X, Y = value.Y };
}
}
然后:
RuntimeTypeModel.Default.Add(typeof(System.Drawing.Point), false)
.SetSurrogate(typeof(PointDto));
使用此配置,库将根据需要转换为代理类型/从代理类型转换 - 想法是您可以在operator
s 中添加所需的任何代码,从而使 DTO 非常简单且易于序列化。
最后,请注意,许多类型都有一个Parse
适用于其ToString
实现的 API;如果您想启用这些Parse
方法的使用(作为最后的努力序列化为字符串),那么:
RuntimeTypeModel.Default.AllowParseableTypes = true;
于 2013-07-05T09:36:38.990 回答