【问题标题】:Best way to load class from database (C#)从数据库加载类的最佳方法(C#)
【发布时间】:2013-10-17 04:47:54
【问题描述】:

我有以下场景:我说过一个车辆类,每个车辆组件都有几个字段:

public WheelBase Wheels;
public EngineBase Engine;
public TrainBase DriveTrain;

对于每个汽车组件,都有几个继承自基类的类,例如我们可能有:V8Engine : EngineBase、V6Engine : EngineBase、I6Engine : EngineBase 等等。

如果我想将汽车的装载保存在标准数据库(例如文本文件)中,并且当我需要装载汽车时,我需要知道应该装载哪个“子类型”组件。例如,我想加载具有 V6Engine 的汽车:EngineBase、SummerTireWheel:WheelBase、ManualTrain:TrainBase。

存储和检索此信息的最佳方式是什么?我能想到的唯一方法就是将“子类型”的名称保存在数据库中,并使用一组开关来创建正确类型的组件,例如:

switch(EngineType)
{
  case "V8Engine" : 
    Engine = new V8Engine();
    break;
  case "V6Engine" :
    Engine = new V6Engine();
    break;
  case "I6Engine" :
    Engine = new I6Engine();
    break;
}

这种方法确实有效,但我觉得它很丑。有没有更优雅的方法来处理这种类型的场景?

【问题讨论】:

  • 你喜欢哪种模式,DataTable-DataSet 还是 Linq/EF。
  • @user,如果您将其保存到标准 rdbms,请查看以下问题:stackoverflow.com/q/18427546/661933。简而言之,枚举是一个不错的选择。
  • 我很想使用序列化,但由于工具的限制,我无法使用它:) 所以序列化是不可能的。
  • @user2503766 您可以使用哪些工具?您拥有什么样的数据库和/或文件访问权限?
  • 您的原始代码不是一个糟糕的方法 - 它基本上是 EF 和其他 ORM 中的 table-per-hierarchy 的工作方式。 (asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/…)

标签: c#


【解决方案1】:

我认为最好的方法是使用 XML 序列化和反序列化

XmlSerializer serializer = new XmlSerializer(typeof(List<MyClass>));

using(FileStream stream = File.OpenWrite("filename"))
{
    List<MyClass> list = new List<MyClass>();
    serializer.Serialize(stream, list);
}

using(FileStream stream = File.OpenRead("filename"))
{
    List<MyClass> dezerializedList = 
        (List<MyClass>) serializer.Deserialize(stream);
}

另见此链接:XML - Can not deserialize after serialize(如何使用继承进行序列化和反序列化)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 2021-07-17
    • 1970-01-01
    • 2016-04-23
    • 2016-12-02
    • 2013-06-29
    • 2012-01-01
    • 2013-10-12
    相关资源
    最近更新 更多