编程语言
首页 > 编程语言> > c# – 如何使用Protobuf.net更改类型中成员的ProtoMember索引?

c# – 如何使用Protobuf.net更改类型中成员的ProtoMember索引?

作者:互联网

我有这样的类型:

[ProtoContract]
class Person {
    [ProtoMember(1)]
    public string Name {get;set:}
    [ProtoMember(2)]
    public int Id {get;set;}
}

后来我意识到我需要另一个属性Age所以添加它像:

[ProtoContract]
class Person {
    [ProtoMember(1)]
    public string Name {get;set:}
    [ProtoMember(3)]
    public int Age {get;set;}
    [ProtoMember(2)]
    public int Id {get;set;}
}

但由于我还处于开发阶段,我想将Age ProtoMember索引从3更改为2,并适当更新Id ProtoMember.

有没有办法轻松做到这一点?或者我是否必须临时创建另一种类型来回转换它直到我可以在更新的表单中将其序列化为我想要的正确类型?

解决方法:

我假设问题是迁移旧数据?如果是这样,那么v2可以为你做到这一点;然而,我也会亲自说“meh,年龄是#3,Id保持#2”(我不能看到改变这个数字的巨大好处).

但作为更一般情况的一个例子:

var oldModel = RuntimeTypeModel.Create();
// "false" here means "don't apply the normal rules; I'll tell you what to do"
oldModel.Add(typeof(Person), false).Add("Name", "Id");

var newModel = RuntimeTypeModel.Create();
// "true" here means it will read from the attributes etc
newModel.Add(typeof(Person), true);

// now: load from an old file, and write to a new:
var obj = oldModel.Deserialize(inFile, null, typeof(Person));
newModel.Serialize(outFile, obj);

通过使用具有不同配置的2个不同RuntimeTypeModel实例,您可以在数据之间应用各种奇数转换.但是再次 – 使用这个只是让Age#2看起来像是大规模的矫枉过正.的确,我会简单地上课:

[ProtoContract]
class Person {
    [ProtoMember(1)]
    public string Name {get;set:}
    [ProtoMember(2)]
    public int Id {get;set;}
    [ProtoMember(3)]
    public int Age {get;set;}
}

看!它们神奇地有序!

标签:c,net,protobuf-net
来源: https://codeday.me/bug/20190621/1252750.html