gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:29:45 24 4
gpt4 key购买 nike

我很难尝试创建 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com