使用JSON序列化作为持久性机制而不是RDB
我正在考虑在我的下一个项目中扔掉我的数据库以简化开发/演化。使用JSON序列化作为持久性机制而不是RDB
这样做的一个方法是不离开对象领域,并通过某种序列化来坚持我的对象。在应用程序关闭时能够编辑初始对象状态会很好,因此像JSON这样的格式会很好。
问题是JSON工具(如Java Jackson)或者说JSON本身不能保留引用,所以在反序列化对象图之后,我可以获得比序列化之前更多的实例 - 每个引用都是相同的对象获取新实例。
我注意到JSPON但它似乎并没有活着。
您如何看待这种方法 - 难道不是太简单吗?或者,也许我应该使用一些OODB(尽管它会产生额外的配置开销,我想保持简单)。
大多数简单便携式串行器(XML,JSON,协议缓冲区)是树串行(不图串行),所以你会看到这个问题有点......
你也许可以尝试使用不需要引用的DTO树?即代替:
Parent -(children)-> Child
<--(parent)--
你有(在DTO级):
Parent {Key="abc"} -(child keys)-> {string}
Child {Key="def"} -(parent key)-> {string}
这应该是与任何树串行化器可用;但它确实需要额外的(手动)处理。有一些基于图形的序列化器,如.NET的DataContractSerializer
(启用了图形模式;默认情况下它被禁用)。但这是不可移植的。
引用问题应该足够简单,以解决假设您控制序列化 - 您只需保存给每个ID的对象,然后根据这些ID保存引用。
但是,虽然我认为你会得到一个简单的版本,我估计你会遇到问题。想到的东西是:
- 随着代码的发展和类的变化会发生什么?
- 您将如何支持查询操作,特别是索引以使查询更快?
- 您将如何管理并发访问?
- 您将如何管理交易?
- 它会如何扩展?
我不认为这些问题是不可逾越的,但恕我直言,关系型数据库是他们根据多年的发展,并在野外和我见过的OODB的使用方式没有在这个现实的命题时间。
此外,关系数据库提供的基于集合的逻辑非常适用于所有类型的问题,更不用说SQL在提炼加载的数据集方面的强大功能,这在对象中并不那么容易世界。现代的ORM让生活变得如此简单,现在我当然想要把自己局限于任何一个领域。
我同意你提到的问题,虽然我正在考虑的特定项目将无法应对大部分问题,因为它不需要扩展,因此可以通过锁定来解决并发问题。也不会有大量的数据,所以性能/索引也不成问题。 交易 - 公平点,但也没有必要 模式演变 - 真实,与查询问题(特别是容易做大规模更新没有简单的方法)有关。尽管如此,LINQ和追随者会让它变得更容易。 – aaimnr 2009-07-03 12:10:04
@deadbeef - 确定无论哪种方式都是一个有趣的练习,所以试着回过头来让我们都知道它是如何发展的。 – 2009-07-03 13:29:38
只要你不离开.NET领域,为什么不使用.NET提供的序列化机制呢?它可以轻松将您的对象图(包含专用字段)序列化到二进制块并再次返回。还有一个内置的XML序列化机制,尽管在私有领域和东西方面有一些限制(尽管如此,你可以解决这个问题)。还有一些属性指定某些字段较新,可能不在序列化的流中。你必须自己处理它们为NULL,但是 - 无论如何你必须这样做。
加:啊,是的,忘了提 - 我在说System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
班。
最新版本的Json.NET支持serializing references。
string json = JsonConvert.SerializeObject(people, Formatting.Indented,
new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
//[
// {
// "$id": "1",
// "Name": "James",
// "BirthDate": "\/Date(346377600000)\/",
// "LastModified": "\/Date(1235134761000)\/"
// },
// {
// "$ref": "1"
// }
//]
List<Person> deserializedPeople = JsonConvert.DeserializeObject<List<Person>>(json,
new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects });
Console.WriteLine(deserializedPeople.Count);
// 2
Person p1 = deserializedPeople[0];
Person p2 = deserializedPeople[1];
Console.WriteLine(p1.Name);
// James
Console.WriteLine(p2.Name);
// James
bool equal = Object.ReferenceEquals(p1, p2);
// true
itemscript项目提出了基于JSON的模式语言。 itemscript模式描述数据类型。 itemscript JAM是在itemscript中开发的应用程序标记。
参考实现包括一个持久化JSON数据的GWT客户端(Item Lens)和一个列存储(Item Store)。
感谢您的适当区别,它清除了我的想法。我发现Xstream(xstream.codehaus.org/graphs.html)可以处理图序列化(我还不确定它是否也可以使用JSON模式,但我可以使用XML)。 – aaimnr 2009-07-03 12:16:05