代码之家  ›  专栏  ›  技术社区  ›  aaimnr

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

  •  2
  • aaimnr  · 技术社区  · 17 年前

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

    一种方法是根本不离开对象领域,通过某种序列化来持久化我的对象。如果能够在应用程序关闭时编辑初始对象状态,那么像JSON这样的格式就很好了。

    问题在于JSON工具(比如JavaJackson),或者JSON本身,不能保存引用,所以在反序列化对象图之后,我可以获得比序列化之前要多的实例——每个引用到同一个对象都会得到新的实例。

    我注意到了 JSPON 但它似乎还活着。

    你对这种方法有什么看法?这不是太简单了吗?或者我应该使用一些oodb(尽管它会产生额外的配置开销,我希望保持简单)。

    6 回复  |  直到 17 年前
        1
  •  5
  •   Marc Gravell    17 年前

    大部分的 简单的 可移植的序列化程序(XML、JSON、协议缓冲区)是 序列化程序(非 图表 序列化程序),所以您会看到这个问题…

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

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

    您有(在DTO级别):

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

    这应该可以用于任何树序列化程序;但它需要额外的(手动)处理。

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

        2
  •  2
  •   Nick Holt    17 年前

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

    不过,虽然我认为你会得到一个简单的版本工作,我认为你会遇到问题。突然想到的是:

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

    我不认为这些问题是不可克服的,但我认为,关系数据库是基于多年的开发和在野外使用的方式,我所看到的OODBS目前不是一个现实的主张。

    另外,有一类问题是关系数据库提供的基于集合的逻辑是理想的,更不用说SQL在优化您加载的数据集方面的强大功能了,这在对象世界中并不容易。随着现代变形金刚使生活变得如此简单,我当然想把自己限制在任何一个领域。

        3
  •  1
  •   James Newton-King dbc    17 年前

    最新版本的 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
  •  1
  •   Community Mohan Dere    9 年前

    我找到了 this 所以问题有帮助。XStream似乎在查找下一个引用时使用树结构中的第一个引用的相对路径来处理引用,即使对于JSON也是如此(请参见 here )

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

        5
  •  0
  •   user124884    17 年前

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

    引用实现包括一个GWT客户机(item lens)和一个列存储(item store),用于保存JSON数据。

        6
  •  -1
  •   Vilx-    17 年前

    只要不离开.NET领域,为什么不使用.NET提供的序列化机制呢?它可以很容易地将对象图(包括私有字段)序列化为二进制blob,然后再重新序列化。还有一个内置的机制可以对XML进行序列化,尽管在涉及私有字段和内容时有一些限制(不过您可以解决这个问题)。还有一些属性指定某些字段较新,可能不在序列化流中。你得自己去处理它们的无效性,但不管怎样,你还是得这么做。

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