如何将与序列化相关的变量转换为简洁的一行代码

本文关键字:简洁 代码 一行 变量 序列化 转换 | 更新日期: 2023-09-27 18:22:38

我有一个包含多个公共变量的类。对于这些变量的子集,我将需要不同的序列化/反序列化方法(例如,将变量AB序列化到BSON,然后稍后将变量<强>B、C、<强>D以及F串行化到XML)。

使用的所有序列化/反序列化方法以及应该通过这些方法处理哪些变量都是已知的编译时。因此,我应该能够将这些代码转换为简洁的一行代码,告诉程序员哪些变量将被序列化/反序列化为组。

我知道Func和Action为Property+lambda表达式设置get/set会使其更像

()=>SomeProperty, value => SomeProperty = value

但这不是很好,因为SomeProperty都在一行中写入两次(我不需要{get;set;})。

问题是我不知道如何在C#(.NET framework 2.0)中做到这一点。我想指定可以传递给序列化和反序列化方法的字符串和变量对。

例如,具有以下等级的

public class SomeClass
{
    public int someNumber;
    public bool someBool;
    public string someString;
    public long someLong;
}

在第一种情况下,我想序列化someBoolsomeLong,所以我想传递类似的东西

var serializeThese = Dictionary<string, Variable>()
{
    { "boolish", this.someBool }, // this.someBool should be reference/pointer
    { "idNumber", this.someLong }, // this.someLong should be reference/pointer
};

序列化像这样的方法

public string SerializeTheseVariables(Dictionary<string, Variable> dict)
{
    string output = "";
    foreach(var pair in dict)
    {
        output += pair.Key + ":" + pair.Value + "-";
    }
    return output;
}

或者,如果我想反序列化,那么我会将serializeThis传递给类似的方法

public void ReinitFromBSON(BSON bson, Dictionary<string, Variable> dict)
{
    foreach(var pair in dict)
    {
        pair.Value = bson[pair.Key];
    }
}

如何将与序列化相关的变量转换为简洁的一行代码

从(反)序列化应该如何工作的定义中拆分要(反)串行化的实例。

类似这样的东西:

var serializeThese = Dictionary<string, Variable>()
{
    { "boolish", nameof(this.someBool) },
    { "idNumber", nameof(this.someLong) },
};

(但是,请注意,nameof是C#6的一个特性。或者,传入Expression并手动挖掘字段/属性的名称也是一种选择。)

然后,您的(反)序列化例程将使用此定义+实际实例,并通过反射访问字段/属性。

public string SerializeTheseVariables(Dictionary<string, Variable> serializationMetadata, object serializedInstance)
{
    …
}