none
WCF JSON序列化循环引用问题 RRS feed

  • 问题

  •       var readList =
                  (
                  from c in browTB
                  join d in bookTB
                  on c.boodId equals d.bookId
                  select new { borwTime = c.borwTime.ToString("yyy-MM-dd"), bookInfo =d}
                  ).ToList();
          string result = jss.Serialize(readList);

    以上是我WCF调用entityframework  edmx实体集查询的结果,我采用JSON序列化对这个查询的匿名类进行序列化,返回给silverlight端,但是当这个匿名类中包含子对象时,报循环引用错误。

    但当去除类包含类时。则可以序列化成功。请问类包含类这种关系,怎样进行JSON序列化,并返回到Silverlight端

    2011年7月5日 7:49

答案

  • 如果你用TFSoft本人精心研制的T4Data系列你就不再会为系列化传输数据烦恼。

    T4Data的T4DataSet及T4DataTable支持自动系列化和反系列化(支持。net所有基础数据类型的系列化,用ToBsStr、FromBsStr语句搞定这个DataTable/DataSet的系列化或反系列化,并智能处理NULL值)。实际上系列化我个人认为国人翻译的不太准确,翻译为持久化更为贴切。

    并且不需要在服务器端事先手动编写或自动创建任何代码或实体,就能在Silverlight端以类似ado.net的方式直接方便高效动态访问Web端数据库。测试表明,当网络速度较快时,甚至比源ado.net装载DataTable的速度还要快。(因为T4DataTable远远没有.net的DataTable复杂,是一个精简版的.net DataTable)。T4Data传输大量数据时(万以上记录,20个以上字段),比WCF RIA快很多。

    本论坛有下载,但提醒你不得用于商业用途。

     

     












    • 已标记为答案 飞耗子 2011年7月8日 16:11
    2011年7月5日 15:07
  • 请用T4DataSet,T4DataSet可以有多个T4DataTable,因此可以实现你的要求。
    其实为了传输数据,你不一定要用Entity,直接用T4DataSet,T4DataTable就可以了。

    而且T4Data系列支持LinqToObject


    呵呵,你还可以做一个这样的DataTable,这个DataTable有一列就是另外一个列的T4DataTable系列化后的字符串。
    可以无限嵌套。
    • 已标记为答案 飞耗子 2011年7月8日 16:12
    2011年7月6日 3:09
  • 你好,

    关于Silverlight与JOSON的问题,你可以参考以下博文:

    http://www.cnblogs.com/Memory/archive/2010/01/23/1654810.html


    Daoping Liu - MSFT
    • 已标记为答案 飞耗子 2011年7月8日 16:13
    2011年7月7日 2:05
    版主

全部回复

  • 如果你用TFSoft本人精心研制的T4Data系列你就不再会为系列化传输数据烦恼。

    T4Data的T4DataSet及T4DataTable支持自动系列化和反系列化(支持。net所有基础数据类型的系列化,用ToBsStr、FromBsStr语句搞定这个DataTable/DataSet的系列化或反系列化,并智能处理NULL值)。实际上系列化我个人认为国人翻译的不太准确,翻译为持久化更为贴切。

    并且不需要在服务器端事先手动编写或自动创建任何代码或实体,就能在Silverlight端以类似ado.net的方式直接方便高效动态访问Web端数据库。测试表明,当网络速度较快时,甚至比源ado.net装载DataTable的速度还要快。(因为T4DataTable远远没有.net的DataTable复杂,是一个精简版的.net DataTable)。T4Data传输大量数据时(万以上记录,20个以上字段),比WCF RIA快很多。

    本论坛有下载,但提醒你不得用于商业用途。

     

     












    • 已标记为答案 飞耗子 2011年7月8日 16:11
    2011年7月5日 15:07
  • 您好,您的T4Data无法持久化类中包含对象的List实体     代码:

      var readList =
                           (
                           from c in browTB
                           join d in bookTB
                           on c.boodId equals d.bookId
                           select new { browTime = c.borwTime.ToString("yyyy-MM-dd"), bookInfo = new { d.bookName,d.price} }
                            ).ToList();
                T4DataTable dt = new T4DataTable();
                dt.FromEntityList(readList);
                string  result = dt.ToBsStr();
                return result;

    dt.FromEntityList,转化成T4DataTable只有1个列,browTime,如果  bookInfo = d.bookName  那就有两个列了。

    2011年7月6日 2:20
  • 请用T4DataSet,T4DataSet可以有多个T4DataTable,因此可以实现你的要求。
    其实为了传输数据,你不一定要用Entity,直接用T4DataSet,T4DataTable就可以了。

    而且T4Data系列支持LinqToObject


    呵呵,你还可以做一个这样的DataTable,这个DataTable有一列就是另外一个列的T4DataTable系列化后的字符串。
    可以无限嵌套。
    • 已标记为答案 飞耗子 2011年7月8日 16:12
    2011年7月6日 3:09
  • 呵呵,您的T4Data感觉功能很强大,请问有没有说明文档参考下示例,这样学起来可以减少点弯路
    2011年7月6日 5:33
  • 文档正在制作之中。这些天有正业(我的正业是农民)要忙。软件设计只是我的副业。过些天,我会补充。

    其实不要什么说明,你吧那个例子下载下来,基本就会。里面的命名也很规范,属性方法在.net也有智能提示。


    2011年7月6日 6:05
  • 你好,

    关于Silverlight与JOSON的问题,你可以参考以下博文:

    http://www.cnblogs.com/Memory/archive/2010/01/23/1654810.html


    Daoping Liu - MSFT
    • 已标记为答案 飞耗子 2011年7月8日 16:13
    2011年7月7日 2:05
    版主