c# - 如何使用 XmlSerializer 创建 XmlRepository?

标签 c# xml xml-serialization repository repository-pattern

我在尝试创建 XmlRepository 时遇到了困难。这里的问题是我唯一的选择是使用 XmlSerializer 来执行此操作。

请检查一下。这真的把我的代码弄乱了,令人沮丧。我想知道如何改进这段代码,我正在考虑创建一个单例,但我不知道如何继续。

 public interface IRepository<T>
    where T : class
{
    T GetById(object id);
    IEnumerable<T> All();
    void Insert(T entity);
    void Remove(T entity);
    void SaveChanges();
} 

public class XmlRepository : IRepository<Configuration>
{
    public XmlRepository(string filename)
    {
        FileName = filename;
    }

    public XmlRepository(string filename)
    {
        FileName = filename;
    }

    internal string FileName { get; private set; }

    private Configuration GetById(object id)
    {
        throw new NotImplementedException();
    }

    public IEnumerable<Configuration> All()
    {
        return Get();
    }

    public void Insert(Configuration entity)
    {
        var configurations = Get();
        configurations.Add(entity);
        Save(configurations);
    }

    public void Remove(Configuration entity)
    {
        var configurations = Get();
        configurations.Remove(entity);
        Save(configurations);
    }

    private List<Configuration> Get()
    {
        try
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Configuration>), null, new Type[] { typeof(BinaryConfiguration) }, new XmlRootAttribute("Configurations"), "http://ofimbres.wordpress.com/");
            StreamReader myWriter = new StreamReader(FileName);
            var list = serializer.Deserialize(myWriter);
            myWriter.Close();

            return (List<Configuration>)list;
        }
        catch (InvalidOperationException ex)
        {
            throw ex;
        }
    }

    public void Save(object configurations)
    {
        try
        {
            XmlSerializer serializer = new XmlSerializer(configurations.GetType(), null, new Type[] { typeof(BinaryConfiguration) }, new XmlRootAttribute("Configurations"), "http://ofimbres.wordpress.com/");
            StreamWriter myWriter = new StreamWriter(FileName);
            serializer.Serialize(myWriter, configurations);
            myWriter.Close();
        }
        catch (XmlException ex)
        {
            throw ex;
        } 
    }
}

有任何疑问,请告诉我。 非常感谢

最佳答案

我不会每次调用存储库时都读取和写入文件,而是执行以下操作:

在构造函数中,您将文件读入 Configuration 对象列表中。就像您现在在 Get 方法中所做的那样。您可以将此列表保存在类的字段中,并将其用于所有其他方法(添加等)。

您的存储库确实有一个 SaveChanges 方法,因此这是将配置序列化回磁盘的理想位置。

这应该比当前方法性能更高,复杂性更低,因此也更不容易出错。

编辑:这是一个开始:

public class XmlRepository : IRepository<Configuration>
{
    private readonly List<Configuration> configurations;

    public XmlRepository(string filename)
    {
        FileName = filename;

        XmlSerializer serializer = new XmlSerializer(typeof(List<Configuration>), null, new Type[] { typeof(BinaryConfiguration) }, new XmlRootAttribute("Configurations"), "http://ofimbres.wordpress.com/");
        using (StreamReader myWriter = new StreamReader(FileName))
        {
            configurations = (List<Configuration>)serializer.Deserialize(myWriter);
            myWriter.Close();
        }
    }

    internal string FileName { get; private set; }

    public Configuration GetById(object id)
    {
        return (from c in configurations where c.Id == id select c).Single();
    }

    public IEnumerable<Configuration> All()
    {
        return configurations;
    }

    public void Insert(Configuration entity)
    {
        configurations.Add(entity);
    }

    public void Remove(Configuration entity)
    {
        configurations.Remove(entity);
    }

    public void SaveChanges()
    {
        XmlSerializer serializer = new XmlSerializer(configurations.GetType(), null, new Type[] { typeof(BinaryConfiguration) }, new XmlRootAttribute("Configurations"), "http://ofimbres.wordpress.com/");
        using (StreamWriter myWriter = new StreamWriter(FileName))
        {
            serializer.Serialize(myWriter, configurations);
            myWriter.Close();
        }
    }
}

还有一些一般性建议

  • 使用using来处理文件/流和其他需要处置的资源(在本例中为StreamReaderStreamWriter)。这保证了即使出现异常,文件也会被关闭。
  • 不要捕获并重新抛出异常,或者如果这样做,至少使用 throw 而不是 throw ex 来保留完整的堆栈跟踪。

希望这有帮助!

关于c# - 如何使用 XmlSerializer 创建 XmlRepository?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10033266/

相关文章:

c# - UIScreen.MainScreen.Bounds.Height 和 UIScreen.MainScreen.Bounds.Width 都是 0

Android,帮助解决 simpleframework PersistenceException

c# - XmlAttribute/XmlText 不能用于编码复杂类型

c# - ASP.net MVC 4 WebApi - 测试 MIME 多部分内容

c# - 如何从 WinForms 应用程序控制新进程窗口的大小和位置?

c#如何将光标设置在插入文本之前的末尾

android - 如何从维基百科文章中提取数据?

java - 从 XML 文件 java 中读取深层的特定元素

sql-server - SQL Server 2008 的自定义字段

c# - 如何动态添加 XmlInclude 属性