c# - 如何将与序列化相关的变量变成简洁的单行代码?

标签 c# serialization

我有一个包含多个公共(public)变量的类。而且我需要对这些变量的子集使用不同的序列化/反序列化方法(例如,将变量 AB 序列化为 BSON,然后再序列化变量BCDEFXML).

所有使用的序列化/反序列化方法以及应该通过这些方法处理的变量都是已知的编译时间。所以我应该能够将它们变成简洁的一行代码,告诉编码人员哪些变量将作为组进行序列化/反序列化。

我知道Func and Action使用 get/set for Property + lambda 表达式会使这更像

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

但这不是很整洁,因为 SomePropertyvalue 都在一行中写了两次(而且我不需要 {get;set ;}).

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

例如与以下类(class)

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;
}

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

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)
{
    …
}

关于c# - 如何将与序列化相关的变量变成简洁的单行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33782433/

相关文章:

c# - 如何确定 WCF 3 和 ASP.NET 是否以编程方式注册到 IIS 7

c# - 启动与文件关联的外部进程并将此应用程序发送到后台

c# - 使用单例模式时,我的公共(public)类应该返回私有(private)实例还是公共(public)实例?

java - GSON GraphAdapterBuilder 接口(interface)失败

python - Django : <django. utils.functional.__proxy__ object at 0x7feaac2761d0> 不是 JSON 可序列化的

c# - 为部分程序抑制 Console.WriteLine

c# - SSH.NET 库对文件名进行编码

javascript - 检测 JavaScript 对象是否具有引用 DOM 元素的某些属性

android - 为什么我会收到 "thread exiting with uncaught exception” ?

javascript - 如何使用 JavaScript 以跨浏览器的方式将 DOM 序列化为 XML 文本?