gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:09:04 24 4
gpt4 key购买 nike

我有这样的类型:

[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 可以为你做这件事; 但是,我个人也会说“嗯,年龄是#3,身份证保持#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 实例,您可以在数据之间应用各种奇怪的转换。但同样 - 使用这个 just 使得 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# - 如何使用 Protobuf.net 更改类型成员的 ProtoMember 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7825486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com