使用JSON序列化作为持久性机制而不是RDB

时间:2009-07-03 11:08:13

标签: c# java json persistence

我正在考虑将我的数据库丢弃在我的下一个项目中以简化开发/演变。

实现它的一种方法是不要完全离开Objects域,并通过某种序列化来保留我的对象。能够在应用程序关闭时编辑初始对象状态会很好,所以像JSON这样的格式会很棒。

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

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

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

6 个答案:

答案 0 :(得分:5)

大多数简单可移植序列化程序(xml,json,协议缓冲区)都是序列化程序(不是图形序列化程序),所以你'我会看到这个问题...

您可以尝试使用不需要引用的DTO树吗?即代替:

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

你有(在DTO级别):

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

这应该适用于任何树序列化器;但它确实需要额外的(手动)处理。

有基于图形的序列化程序,如.NET DataContractSerializer(启用了图形模式;默认情况下禁用);但这不是便携式的。

答案 1 :(得分:2)

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

然而,虽然我认为你会得到一个简单的版本,但我认为你会遇到问题。想到的事情是:

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

我不认为这些问题是不可克服的,但恕我直言,关系数据库是他们基于多年的发展和野外使用的方式,我看到的OODB目前不是一个现实的主张。

此外,关系数据库提供的基于集合的逻辑是理想的一类问题,更不用说SQL在改进你加载的数据集方面的强大功能,这在对象世界中并不那么容易。随着现代ORM让生活如此轻松,我当然希望将自己局限于任何一个领域。

答案 2 :(得分:1)

我发现this这个问题很有帮助。 XStream似乎通过在查找下一个引用时使用树结构中的相对路径到第一个引用来处理引用,即使对于json也是如此(参见here)。

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

参考实现包括持久化JSON数据的GWT客户端(项目镜头)和列存储(项目存储)。

答案 5 :(得分:-1)

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

已添加:啊,是的,忘了提 - 我说的是System.Runtime.Serialization.Formatters.Binary.BinaryFormatter课程。