【问题标题】:deserializing data best practices反序列化数据最佳实践
【发布时间】:2013-04-16 18:08:24
【问题描述】:

我被赋予了反序列化一些数据的任务。数据已全部转换为以下格式的字符串:

InternalNameA8ValueDisplay NameA¬InternalNameB8ValueDisplay NameB¬ 等等等等

(即,它有一个内部名称,'8',值,显示名称,后跟'¬'**)。例如,您将拥有FirstName8JoeFirst Name¬

我无法控制这些数据是如何序列化的,它是遗留的东西。

我曾想过对字符串进行一系列拆分,或者将其拆分为一个 char 数组并以这种方式拆分文本。但这似乎很可怕。这种方式有太多可能出错的地方(例如,如果电话号码的值(例如)可能以“8”开头。

我想知道人们对此的处理方式是什么?有什么更聪明的方法可以分解数据

注意: '¬' 实际上不是字符,它看起来更像是一个指向左侧的箭头。但我现在不在我的机器旁。呵呵!

谢谢。

【问题讨论】:

  • 数据模式很难看,所以解析解决方案不会很漂亮。字段之间的区别是什么?
  • 我认为您正在将二进制数据作为文本读取,因此您的字符串非常丑陋(而且几乎无法解析)。
  • 我认为你在这里的“最佳实践”为时已晚。您继承了一种无法更改的奇怪格式,因此您处理它的方法也可能很奇怪。我的建议是找到一种方法来解析正确的数据,然后让该代码看起来尽可能好。
  • 是的,太可怕了。看起来它必须是类似丑陋的东西才能反序列化。谢谢大家。
  • 谢谢大家。但如前所述,我对这篇文章的内容很感兴趣。 @I4V 如果您说我们正在将二进制数据作为文本读取,您是否知道将其作为原始数据取回并找到另一种提取数据的方法?

标签: c# .net c#-4.0 serialization deserialization


【解决方案1】:

我建议不要使用拆分,而是使用简单的状态机。遍历每个字符,直到遇到分隔符,然后您就知道您在下一个字段上。这可以解决电话号码中的“8”之类的问题。

注意 - 前面有未经测试的代码。

var fieldValues = new string[3];
var currentField = 0;
var line = "InternalNameA8ValueDisplay NameA¬InternalNameB8ValueDisplay NameB¬";

foreach (var c in line)
{
    if (c == '8' && currentField == 0)
    {
        currentField++; continue;
    }

    if (c == '¬')
    {
        currentField++; continue;
    }

    fieldValues[currentField] += c;
}

处理不稳定的格式 - 总是很开心!

祝你好运, 埃里克

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 2022-01-03
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多