【问题标题】:Which serialization to use for my c# objects to save them in a SQL database为我的 c# 对象使用哪种序列化以将它们保存在 SQL 数据库中
【发布时间】:2013-06-18 14:21:09
【问题描述】:

我正在寻找一些建议,可能没有硬性和快速的答案,但任何想法都值得赞赏。应用非常典型。它是一个 c# 代码,目前使用的是 VS2010。除其他外,此代码用于从模型向最终用户提供数据。该模型本身基于一些已知数据在固定点(“立方体”)的各种参数和设置。在标准编程实践中,用户通过公共“get”函数访问数据,这些函数又依赖于私有成员变量,例如已知数据和设置。到目前为止,标准。现在我想将向用户提供这些数据的类保存到一个 sql 数据库中——主要是这样所有用户都可以共享相同的数据(或更准确地说是模型生成的数据)。

当然,我可以只取类的每个成员变量,然后使用 sql 数据库将它们写入 db 并从中重新实例化类。但我不想错过 .net 和 c# 提供的所有好东西。所以我想做的是序列化对象并使用 linq to sql 将其喷射到数据库中。 linq to sql 部分很简单,但在序列化方面我是个新手,对此我有点担心/困惑。似乎很明显的事情是将对象格式化为 xml 并将其作为 sql 数据类型“xml”的表中的列写入数据库。但这给我留下了几个问题。

据我了解,标准 XMLserializer 只会将类的公共成员写入 xml。这对我来说似乎是一个非首发,因为我的课程设计是基于保持大部分课程的私密性(与所有公共成员一起编写课程超出了我的经验 - 谁这样做?)。这使我考虑了 DataContractSerializer,您可以在其中选择用于序列​​化的变量。然而,这似乎有一些 WCF 依赖项,我想知道使用它的潜在缺点是什么。此外还有 SoapFormatter,它似乎在 Web 应用程序和 JSON 中更为流行。我并没有真正考虑这些,但也许我应该考虑?也许有更好的方法来解决这个问题?也许有点冗长,但希望所有上下文都可以提供帮助,以便人们可以给我一些建议。

【问题讨论】:

  • 您是否考虑过创建一个映射类来接受您的模型之一并明确存在将其映射到数据库和从数据库映射出来?
  • 是的——我之前做过类似的事情,为每个成员单独写入数据库——增加了一些令人讨厌的延迟。但是我想您实际上可以将映射器作为您建议的“定制序列化程序”,只需将所有内容集中到一个 blob 中并将其转储到数据库中。我基本上很懒,想使用内置功能。
  • 看看 Dapper,它是一个轻量级 ORM,往往比 LinqToSQL 或大多数其他 ORM 更快。code.google.com/p/dapper-dot-net
  • 谢谢,一定会试一试的。

标签: c# sql xml serialization datacontractserializer


【解决方案1】:

我有与您类似的要求,并且在这方面做了很多研究。我使用 XMLSerialization、JSON、BinraryFormatter 完成了许多概念验证项目,并且不要忘记一些自制的 hack。我几乎决定使用 JSON (JSON.NET),直到找到protobuf-net!它速度快、体积小、版本独立、支持继承且易于实现,无需对代码进行太多更改。强烈推荐。

【讨论】:

  • 查询 (linq/SQL) 是我在我的应用程序中不关心的事情。我有其他参数可以用来识别我的序列化对象。忘记说了。
【解决方案2】:

如果您将对象存储为 XML,则很难从数据库中使用它。例如,如果您将客户对象存储为 XML,您将如何编写以下内容?

select * from Customers where LastName = 'Obama'

可以做到,但并不容易。

如何将对象映射到数据库是一个有争议的主题。易于上手的框架在应用程序的后期可能会变得过于复杂。由于大多数应用程序在维护上花费的时间比在初始开发上要多,所以我会使用最简单的可行模型。

Plain ADO.NET 或 Dapper 是很好的竞争者。您将编写更多样板代码,但复杂性的降低足以弥补这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多