【问题标题】:How to turn serialization related variables to neat one-liners?如何将序列化相关变量转换为整洁的单行代码?
【发布时间】:2015-11-18 14:18:37
【问题描述】:

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

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

我知道 Func and Action 带有属性 + lambda 表达式的 get/set 会让这更像

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

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

问题是我不知道如何在 C#(.NET 框架 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;
}

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

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

【问题讨论】:

  • 如果您需要使用多个序列化,那么现在是开始使用DTO 的好时机。不要对原始类做任何事情,但提供获取/设置 bsonDTO 和 xmlDTO 的方法。然后将它们用于序列化/反序列化。

标签: c# serialization


【解决方案1】:

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

类似这样的:

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

【讨论】:

    猜你喜欢
    • 2017-12-21
    • 2013-08-24
    • 1970-01-01
    • 2015-06-26
    • 2019-12-12
    • 1970-01-01
    • 2012-12-10
    • 2021-09-01
    • 2021-10-09
    相关资源
    最近更新 更多