Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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# 当我们需要维护遗留支持时,如何更新现有数据结构?_C#_Design Patterns_Serialization - Fatal编程技术网

C# 当我们需要维护遗留支持时,如何更新现有数据结构?

C# 当我们需要维护遗留支持时,如何更新现有数据结构?,c#,design-patterns,serialization,C#,Design Patterns,Serialization,长话短说,我们有一个老化的应用程序,经过多年的开发,它已经变得有些粗糙了。不过,有一些固定的东西已经开始引起问题,这让我思考如何更好地构造数据。不过,问题是我们需要维护对客户机可能拥有的旧序列化数据文件的支持,这使得如果我们对类进行任何彻底的更改,就很难迁移到新版本 我的问题是,如果我们决定在重构代码方面投入一些精力,是否有一个好的、经过测试的流程/架构模式可以潜在地帮助我们 编辑这都是二进制序列化只是想大声说出来,但类似于COM用来“版本化”东西的工作方式。类似于: [Serializable

长话短说,我们有一个老化的应用程序,经过多年的开发,它已经变得有些粗糙了。不过,有一些固定的东西已经开始引起问题,这让我思考如何更好地构造数据。不过,问题是我们需要维护对客户机可能拥有的旧序列化数据文件的支持,这使得如果我们对类进行任何彻底的更改,就很难迁移到新版本

我的问题是,如果我们决定在重构代码方面投入一些精力,是否有一个好的、经过测试的流程/架构模式可以潜在地帮助我们


编辑这都是二进制序列化

只是想大声说出来,但类似于COM用来“版本化”东西的工作方式。类似于:

[Serializable]
public class Data
{
    public string Field1 {get; set;}
}

[Serializable]
public class Data2
{
    public Data2() { _version1 = new Data();}

    [NonSerialized]
    private Data _version1; 
    public string Field1 
    { 
        get { return _version1.Field1;} 
        set { _version1.Field1 = value;}
    }
    public int Field2 {get; set;}
}

[Serializable]
public class Data3
{
    public Data3() { _version2 = new Data2();}

    [NonSerialized]
    private Data2 _version2;
    public string Field1 
    { 
        get { return _version2.Field1;} 
        set { _version2.Field1 = value;}
    }
    public int Field2 
    { 
        get { return _version2.Field2;} 
        set { _version2.Field2 = value;}
    }
    public double Field3 {get; set;}    
}
事实上,现在我看到了摆在我面前的这个问题,我不能说这是一个理想的解决方案。这将很快导致“版本号地狱”的泛滥,这与现在的COM非常相似(有时间查看各种DirectX接口名称)


这就是说,这是一个潜在的答案,所以我将保留它。

遗留代码使用的序列化格式是什么?(XML或二进制)二进制。不过,我正在寻找一些更通用的东西,这样我以后可以在其他地方应用它:)a是您所需要的,所以我想您需要向序列化数据添加一个“version”属性。对于没有版本的任何内容,将其视为“版本0”…啊,好的,然后我们可以为每个版本的数据实施一个策略。这是有道理的嗯,这很有趣。我是这样想的,但我想知道我是否应该拿出一个接口,这样我就可以在与应用程序对话的同时重新构造数据。很高兴知道其他人也有同样的想法。我认为,如果您使用的是DI框架,那么版本号问题就不会那么严重了