【问题标题】:What are the benefits of using ORM over XML Serialization/Deserialization?与 XML 序列化/反序列化相比,使用 ORM 有什么好处?
【发布时间】:2010-04-02 14:30:00
【问题描述】:

我一直在阅读有关 NHibernate 和 Microsoft 的实体框架的信息,以针对我的数据访问层执行对象关系映射。我对拥有一个已建立的框架来执行 ORM 的好处很感兴趣,但我很好奇将它用于标准 XML 序列化和反序列化的性能成本。

现在,我在 Oracle 和 SQL Server 中开发存储过程,它们使用 XML 类型作为输入或输出参数,并根据需要返回或分解 XML。我使用自定义数据库命令对象,该对象使用泛型将 XML 结果反序列化为指定的可序列化类。

通过结合使用泛型、xml(反)序列化和 Microsoft 的 DAAB,我得到了一个相当简单的开发流程,无论数据源如何。此外,由于我专门使用存储过程来执行数据库操作,因此我基本上不受数据结构更改的影响。

这是我一直在做的一个过于简单的例子。


static void main() {
     testXmlClass test = new test(1);
     test.Name = "Foo";
     test.Save();
}

// Example Serializable Class ------------------------------------------------
[XmlRootAttribute("test")]
class testXmlClass() {
     [XmlElement(Name="id")]
     public int ID {set; get;}
     [XmlElement(Name="name")]
     public string Name {set; get;}

     //create an instance of the class loaded with data.
     public testXmlClass(int id) {
         GenericDBProvider db = new GenericDBProvider();
         this = db.ExecuteSerializable("myGetByIDProcedure");
     }

     //save the class to the database...
     public Save() {
         GenericDBProvider db = new GenericDBProvider();
         db.AddInParameter("myInputParameter", DbType.XML, this); 
         db.ExecuteSerializableNonQuery("mySaveProcedure");
     }
}

// Database Handler ----------------------------------------------------------
class GenericDBProvider {

     public T ExecuteSerializable<T>(string commandText) where T : class {
          XmlSerializer xml = new XmlSerializer(typeof(T)); 

          // connection and command code is assumed for the purposes of this example.
          // the final results basically just come down to...

          return xml.Deserialize(commandResults) as T;
     }

     public void ExecuteSerializableNonQuery(string commandText) {
          // once again, connection and command code is assumed...
          // basically, just execute the command along with the specified
          // parameters which have been serialized.
     }

     public void AddInParameter(string name, DbType type, object value) {
          StringWriter w = new StringWriter();
          XmlSerializer x = new XmlSerializer(value.GetType());

          //handle serialization for serializable classes.
          if (type == DbType.Xml && (value.GetType() != typeof(System.String))) {
               x.Serialize(w, value);
               w.Close();
               // store serialized object in a DbParameterCollection accessible
               // to my other methods.
          } else {
               //handle all other parameter types
          }
     }
}

我正在启动一个严重依赖数据库操作的新项目。我很想知道我目前的做法在高流量情况下是否可持续,以及我是否应该考虑切换到 NHibernate 或 Microsoft 的实体框架来执行本质上似乎归结为我目前正在做的事情正在做。

感谢您的任何建议。

【问题讨论】:

    标签: .net xml database orm


    【解决方案1】:

    首先,除非您愿意放弃使用存储过程,否则 NHibernate 不会提供太多好处,并且实体框架可能会让您感到沮丧。

    在我看来,您似乎在尝试重新发明轮子。通过切换到使用普遍接受的 ORM 工具,您可以确信您的项目在高流量情况下是可持续的(您可以使用 NH ProfEF Prof 等工具来提供帮助这里)。此外,使用 ORM 将在此过程中提供更多好处,包括提高可维护性和在小幅提升期后的最终生产力。

    【讨论】:

    • 感谢 Bermo,在做了一些额外的评估后,我们决定不继续使用完整的 ORM。主要是因为我们目前的设计计划已经制定好了,此时学习成本太高了。但是,我计划将它用于一个副项目,以便在下一个主要工作项目出现时做好准备。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多