被系列化的对象保存总是有问题

1 view
Skip to first unread message

勇敢的心

unread,
Nov 27, 2006, 10:42:07 PM11/27/06
to NBear Google Group
获取一个对象的实例后在客户端赋值,可包装后保存,Update好像有点不太正确.
为什么会是更新全部字段呢?而且也不能级联更新.修改这个实例中的一个对象值后,
这个对象是不能保存的.这是什么原因呢?


比如:
服务器端:
User user = UserInfo.GetUser(1);
return user;
user.username = "测试一";

客户端:
$("username").value = "测试二";
user.username = $("username").value;

Save(user);
这个user在服务器也有相的方法.可当前user为客户端对象.
在服务器端转换成User对象.这时保存就出上面的问题了.

如果不系列化保存,级联更新怎么会包含主键更新呢?
上面的问题倒不存在.
UPDATE [blog_User_Info] SET [address] = @address WHERE [userid] =
@userid_7a4b536e1c73450a85f4d99f75bc617b
Parameters:
@address[String] = "测试一下效果"
@userid_7a4b536e1c73450a85f4d99f75bc617b[Int32] = 3

UPDATE [blog_User] SET [username] = @username, [userid] = @userid WHERE
[userid] = @userid_b7442849f76b4712a0a4b691dd7f1148
Parameters:
@username[String] = "无名"
@userid[Int32] = 3
@userid_b7442849f76b4712a0a4b691dd7f1148[Int32] = 3

可userid都是主键啊.

Teddy

unread,
Nov 27, 2006, 10:59:55 PM11/27/06
to nbear...@googlegroups.com
如果是经过序列化的实体,那么的确有些不能序列化的信息,如实体被修改的字段列表等会丢失的,结果就会有你说的问题。这应该算目前的一个不足之处,我会考虑在后面的版本进行改进。
 
你说的第二个问题,userid被包含到更新中是不应该的(尽管这里除了多无谓更新了一次倒也没有危害),你是不是忘了给blog_User.userid对应的实体属性设置PrimaryKey?

Teddy

勇敢的心

unread,
Nov 28, 2006, 10:38:21 PM11/28/06
to NBear Google Group
哪些信息系列化时会丢失呢?如果想在加载数据后再通过
Ajax就没法正确保存数据了吗??
可是现在一般都是通过异步来保存和加载数据啊!
有什么好的解决办法吗?
还有Ajax 和 LazyLoad 冲突。会循环加载的。

Teddy

unread,
Nov 28, 2006, 10:43:55 PM11/28/06
to nbear...@googlegroups.com
目前,序列化反序列化后所有和数据持久化相关的信息会丢失。
 
将来版本计划尽可能想办法能在序列化时保存这些信息,暂时没有特别完美的解决办法。
 
Ajax和LazyLoad的冲突,只有通过改进序列化方法来处理,比如,我不知道你用的ajax框架的json序列化方法,是否会ignore某些类型的属性。
或者是否可以通过标注类似SerializationIgnore这样的Attribute来避免序列化。
 
或者你也可以自己重写一个json序列化方法,避免序列化特定的属性。
 
Teddy

 

勇敢的心

unread,
Nov 29, 2006, 10:10:15 PM11/29/06
to NBear Google Group
求救Teddy,怎么样做才能在转换时那些信息不丢失啊。
能不能教我怎样重写一个json序列化的方法呢?
最重要的就是能将读取时的信息能还原。

经系列化后再保存数据用这个组件很不方便啊。
其它方面用起真的是很不错。

Teddy

unread,
Nov 29, 2006, 10:22:01 PM11/29/06
to nbear...@googlegroups.com
目前的版本要在序列化时保留所有的这些丢失的休息,不是那么容易,手工来做也过于复杂了,不值得推崇。我会尽快在下一版本改进这方面的支持。
 
自定义json序列化你可以使用NBear.Common.JSON命名空间下的类,new一个对象,put数据进去就行,你的自定义序列化方法负责读取entity的属性,并返回一个jsonobject对象就行(根据需要忽略某些属性就能避免序列化时的死循环)。obj.ToString()返回的就是json序列化内容。
 
Teddy
 
Reply all
Reply to author
Forward
0 new messages