2009-07-03 36 views
2

我正在考虑在我的下一个项目中扔掉我的数据库以简化开发/演化。使用JSON序列化作为持久性机制而不是RDB

这样做的一个方法是不离开对象领域,并通过某种序列化来坚持我的对象。在应用程序关闭时能够编辑初始对象状态会很好,因此像JSON这样的格式会很好。

问题是JSON工具(如Java Jackson)或者说JSON本身不能保留引用,所以在反序列化对象图之后,我可以获得比序列化之前更多的实例 - 每个引用都是相同的对象获取新实例。

我注意到JSPON但它似乎并没有活着。

您如何看待这种方法 - 难道不是太简单吗?或者,也许我应该使用一些OODB(尽管它会产生额外的配置开销,我想保持简单)。

回答

5

大多数简单便携式串行器(XML,JSON,协议缓冲区)是串行(不串行),所以你会看到这个问题有点......

你也许可以尝试使用不需要引用的DTO树?即代替:

Parent -(children)-> Child 
     <--(parent)-- 

你有(在DTO级):

Parent {Key="abc"} -(child keys)-> {string} 
Child {Key="def"} -(parent key)-> {string} 

这应该是与任何树串行化器可用;但它确实需要额外的(手动)处理。有一些基于图形的序列化器,如.NET的DataContractSerializer(启用了图形模式;默认情况下它被禁用)。但这是不可移植的。

+1

感谢您的适当区别,它清除了我的想法。我发现Xstream(xstream.codehaus.org/graphs.html)可以处理图序列化(我还不确定它是否也可以使用JSON模式,但我可以使用XML)。 – aaimnr 2009-07-03 12:16:05

2

引用问题应该足够简单,以解决假设您控制序列化 - 您只需保存给每个ID的对象,然后根据这些ID保存引用。

但是,虽然我认为你会得到一个简单的版本,我估计你会遇到问题。想到的东西是:

  • 随着代码的发展和类的变化会发生什么?
  • 您将如何支持查询操作,特别是索引以使查询更快?
  • 您将如何管理并发访问?
  • 您将如何管理交易?
  • 它会如何扩展?

我不认为这些问题是不可逾越的,但恕我直言,关系型数据库是他们根据多年的发展,并在野外和我见过的OODB的使用方式没有在这个现实的命题时间。

此外,关系数据库提供的基于集合的逻辑非常适用于所有类型的问题,更不用说SQL在提炼加载的数据集方面的强大功能,这在对象中并不那么容易世界。现代的ORM让生活变得如此简单,现在我当然想要把自己局限于任何一个领域。

+0

我同意你提到的问题,虽然我正在考虑的特定项目将无法应对大部分问题,因为它不需要扩展,因此可以通过锁定来解决并发问题。也不会有大量的数据,所以性能/索引也不成问题。 交易 - 公平点,但也没有必要 模式演变 - 真实,与查询问题(特别是容易做大规模更新没有简单的方法)有关。尽管如此,LINQ和追随者会让它变得更容易。 – aaimnr 2009-07-03 12:10:04

+0

@deadbeef - 确定无论哪种方式都是一个有趣的练习,所以试着回过头来让我们都知道它是如何发展的。 – 2009-07-03 13:29:38

1

我找到了this SO问题有帮助。在寻找下一个引用时,XStream似乎可以通过在树结构中使用相对路径来处理引用,即使是json(参见here)。

Simple显然可以处理更复杂的对象图,但XStream似乎更受欢迎,JSON并可能适合我的需要(我不会有循环引用)。

-1

只要你不离开.NET领域,为什么不使用.NET提供的序列化机制呢?它可以轻松将您的对象图(包含专用字段)序列化到二进制块并再次返回。还有一个内置的XML序列化机制,尽管在私有领域和东西方面有一些限制(尽管如此,你可以解决这个问题)。还有一些属性指定某些字段较新,可能不在序列化的流中。你必须自己处理它们为NULL,但是 - 无论如何你必须这样做。

加:啊,是的,忘了提 - 我在说System.Runtime.Serialization.Formatters.Binary.BinaryFormatter班。

1

最新版本的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 
0

itemscript项目提出了基于JSON的模式语言。 itemscript模式描述数据类型。 itemscript JAM是在itemscript中开发的应用程序标记。

参考实现包括一个持久化JSON数据的GWT客户端(Item Lens)和一个列存储(Item Store)。

相关问题