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

时间:2009-10-31 01:13:43

标签: c#

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

但是,我想在MyDataSet的存储方面实施更好的实践。在理想的世界中,我认为它应该是静态的,但这可以防止XML的反序列化。我试着让它成为一个单身人士,但单身人士的实例仍然需要在某个地方“活着”。

在这种情况下,最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

这实际上取决于你对单身人士的实施。如果你use the static reference of the class strategy,这几乎是常态,那么单例类就是持有实例。 (这就是重点。)

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

答案 1 :(得分:1)

如果您愿意,可以使用Static类(在针对FrameWork 2.0和4.0编译的VS 2010 beta 2中进行测试)。

这里我们只是使用静态方法(获取和设置私有实例)来解决您不能拥有静态属性的事实。我看到的唯一真正的区别是,将这种方法与使用Public类进行比较,就像在AlphaZero的出色响应中那样,因为你永远不能使用'new on static class ...你有一点额外的“单身” -ness“:)

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

<注意2:我真正质疑的一件事是我是否在私有DataSet实例的“延迟实例化”中的readXMLintoDataSet方法中“做了正确的事”:如果DataSet实例已经实例化,可能使用Clear()是不够的?也许“正确的事情”是总是在它上面使用Dispose()并重新实例化它? >

<注3:我在这里使用超长的变量/方法名称...我希望...让代码通信:是的,你必须键入类似的东西:

TestStaticXMLDataSet.readXMLintoDataSet("someXML.xml");

使用此代码...假设您的使用者类位于不同的命名空间中...而且,显然,如果您使此类共享使用者类命名空间,则可以缩短其使用语法。 >

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