Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Protobuf.net更改类型中成员的ProtoMember索引?_C#_.net_Protobuf Net - Fatal编程技术网

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

C# 如何使用Protobuf.net更改类型中成员的ProtoMember索引?,c#,.net,protobuf-net,C#,.net,Protobuf Net,我有这样一种类型: [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 Na

我有这样一种类型:

[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;}
}
但由于我仍处于开发阶段,我想将
年龄
原始成员
索引从3更改为2,并适当地更新
Id
原始成员


有没有一种方法可以轻松做到这一点?或者我必须临时创建另一个类型来来回转换它,直到我可以将它序列化为更新表单中所需的正确类型?

库中没有任何内容可以帮助您完成此操作。因此,如果确实需要,您必须编写一些内容来更新数据

如果你有一堆数据,你应该保持字段ID不变。这没什么大不了的。ID为1-16,我认为只使用1字节作为字段标记,数字越大,使用的字节越多


保持id的原样的好处是它提供了向前和向后的兼容性。

我想问题是迁移旧数据?如果是这样的话,那么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);
通过使用两个不同配置的
RuntimeTypeModel
实例,您可以在数据之间应用各种奇怪的转换。但是,再次强调,使用这个方法只是为了
Age
is#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;}
}

看!它们神奇地排列整齐

谢谢Mark,我今天会试试这个:OAlso Mark,抱歉我忘了说,但这不是真正的旧数据。因此,我将新版本序列化为一个索引为1、3、2的文件。所以现在我们要把它们变成1,2,3。因此,在您的代码中,我只需更改第2行以添加年龄,但按我想要的顺序?@JoanVenge sure(尽管注意我选择的方向是“旧=显式,新=使用属性”,因此将是“但按它们的顺序”-或者,只需颠倒旧/新)谢谢,我也希望前后兼容,但由于该应用程序仍在开发中,希望它更干净。