我有以下课程,我想为其构建一个protobuf-net类型模型:
[DataContract]
public class Currency
{
[DataMember(Order = 0)]
private readonly string code;
public Currency(string code)
{
// Initialize members
this.code = code;
}
public string Code
{
get { return this.code; }
}
}
我按如下方式设置了类型模型:
var model = TypeModel.Create();
var typeInModel = model.Add(typeof(Currency), true);
typeInModel.UseConstructor = false;
当我在添加此类型后查看类型模型中的“fields”成员时,我看不到代码成员的任何内容。我在这里缺少什么?
更新:现在可以创建类型模型,但序列化仍然不起作用。
答案 0 :(得分:1)
我的同事发现,如果您更改了DataMember订单:
[DataMember(Order = 0)]
为:
[DataMember(Order = 1)]
虽然序列化仍然不起作用,但一切都突然用于构建类型模型。
答案 1 :(得分:1)
您编写的代码(使用答案中的[DataMember(Order=1)]
修补程序)运行正常。以下内容:
var obj = new Currency("abc");
var clone = (Currency) model.DeepClone(obj);
Console.WriteLine(ReferenceEquals(obj, clone));
Console.WriteLine(clone.Code);
输出
False
abc
完全如我所料 - 意思是:不同的对象实例,但是使用正确的值成功创建。
如果你做的不同,请告诉我。另请注意,根据评论,私人会员的反映在某些平台上受到限制 - 最明显的是Silverlight和Phone 7。
答案 2 :(得分:0)
在部分信任模式下运行WCF代码时,不支持只读字段(公共和私有)的序列化和反序列化。这是因为生成的IL无法验证,因此需要提升权限。
答案 3 :(得分:0)
序列化过程中的某些内容会跳过没有setter的属性。
这似乎有点像黑客,但我通常会这样做:
[DataMember]
public string Code {
get { return this.code; }
set { }
}
一旦集合存在,即使它什么都不做,它也会在序列化过程中被选中。