代码之家  ›  专栏  ›  技术社区  ›  Ian Gregory

用于序列化/反序列化的应用程序范围数据的静态、密封、单例或其他内容

c#
  •  1
  • Ian Gregory  · 技术社区  · 15 年前

    我的应用程序使用序列化从磁盘上的文件加载XML数据集,将该数据集保存在内存中用于各种操作,然后在数据集关闭时将其序列化回磁盘。当前,存储该数据集的对象是MainForm类的子属性。我可以使用mainform.mydataset从其他类访问它。

    但是,我希望在存储MyDataSet方面实现更好的实践。在理想情况下,我认为它应该是静态的,但这会阻止XML的反序列化。我试着让它成为单身汉,但单身汉的例子仍然需要“生活”在某个地方。

    在这种情况下,最佳实践是什么?

    2 回复  |  直到 15 年前
        1
  •  2
  •   alphazero    15 年前

    它实际上取决于单例的实现。如果你 use the static reference of the class strategy ,这基本上是正常的,然后singleton类持有实例。(这就是重点。)

    using System;
    
    public class MyDataset
    {
       private static MyDataset instance;
    
       // TODO: add property that is holding the dataset
    
       private MyDataset() {}
    
       public static MyDataset Instance
       {
          get 
          {
             if (instance == null)
             {
                instance = new MyDataset();
             }
             return instance;
          }
       }
    }
    
        2
  •  1
  •   BillW    15 年前

    如果愿意,可以使用静态类(在根据框架2.0和4.0编译的Vs2010测试版2)。

    这里我们只是使用静态方法(获取和设置私有实例)来解决不能拥有静态属性的问题。我看到的唯一真正的区别是,将这种方法与使用公共类进行比较,就像阿尔法泽罗出色的反应一样,是…因为你不能在静态类上使用“new”…你还有一点额外的“单身”:)

    <注1:我刚刚开始自己“探索”这个领域,所以我非常欢迎对这里显示的示例代码的任何评论、反馈:我是来学习的:)>

    <注2:我真正要问的一件事是,我是否在私有数据集实例的“lazy instanting”中的readxmlintodataset方法中“做了正确的事情”:如果数据集实例已经实例化,那么使用clear()可能还不够?也许“正确的事情”是始终对其使用dispose()并重新实例化它?gt;

    <注3:我在这里使用了更长的变量/方法名…我希望…使代码通信:是的,您必须键入如下内容:

    TestStaticXMLDataSet.readXMLintoDataSet("someXML.xml");
    

    要使用此代码…假设您的使用者类位于不同的命名空间中…而且,很明显,如果您让这个类共享使用者类名称空间,您可以缩短它的使用语法。gt;

    using System.Xml;
    using System.IO;
    using System.Data;
    
    namespace TestStaticXMLDataSet
    {
        public static class DataSetClass
        {
            internal static DataSet _dataSet;
    
            public static void setDataSet(DataSet incomingDataSet)
            {
                _dataSet = incomingDataSet;
            }
    
            public static DataSet getDataSet()
            {
                return _dataSet;
            }
    
            public static void readXMLintoDataSet(string filePath)
            {
                if (_dataSet == null)
                {
                    _dataSet = new DataSet();
                }
                else
                {
                    _dataSet.Clear();
                }
    
                _dataSet.ReadXml(filePath);
            }
    
            public static void writeDataSetToXML(string filePath)
            {
                if (_dataSet == null)
                {
                    return;
                }
                else
                {
                    _dataSet.WriteXml(filePath);
                }
            }
        }
    }