我有以下类,我想为它构建一个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;
当我在添加此类型后查看类型模型中的"字段"成员时,我没有看到代码成员的任何内容。我在这里错过了什么?
更新:现在可以创建类型模型,但序列化仍然不起作用。
我的同事发现,如果您将 DataMember 顺序从:
[DataMember(Order = 0)]
自:
[DataMember(Order = 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。
在部分信任模式下运行 WCF 代码时,不支持只读字段(公共和私有)的序列化和反序列化。这是因为生成的 IL 不可验证,因此需要提升的权限。
查看文档。
序列化过程中的某些内容会跳过没有资源库的属性。
这似乎有点黑客,但我通常这样做:
[DataMember]
public string Code {
get { return this.code; }
set { }
}
一旦集合在那里,即使它什么都不做,它也会在序列化过程中被拾取。