c# - 如何在 flex 中为 C# 后端序列化对象

标签 c# apache-flex actionscript-3 web-services serialization

我们正在开发一个应用程序,它有一个 Flex 前端和一个 C# 后端,通过网络服务连接。 我们使用 FLex Builder 3 的 Web 服务管理器来自动生成 Web 服务类。 当 Flex 序列化我们的对象时会出现问题,例如,当我们有一个没有值的 Number 属性时,它被序列化为 NaN,而我们的后端不知道 NaN。另一个例子是当我们序列化一个循环引用时,我们得到一个堆栈溢出异常。 我知道在 java 中,例如,您可以配置 xstream 使用循环引用的方式...所以,问题是,我们能否更改 Flex 序列化对象的方式,以便 C# 可以使用此前端?关于 flex 如何序列化对象有什么我们应该知道的问题吗? 谢谢! 豪尔赫

最佳答案

我认为你应该考虑一些不同的设计,我们也有类似的问题,但我们开发了以下解决方案。

只有原始参数

在 Web 服务方法参数(字符串、整数)等中仅定义原始类型。

例如你有一个类,

class Person{
    long PersonID;
    long MembershipID;
    string Name;
}

而且你只想在后端更改“Name”属性,事实是,你不应该相信你的前端,你应该认为前端很容易被破坏并且可以发送错误的数据,比如 MembershipID 在这种情况下是永远不会被前端修改的字段。

您可以编写 Person 将正确保存的代码,但其他人可以轻松阅读 WSDL 并破坏代码。

所以不是这个。

[WebMethod] 
public void SavePerson(Person p){
    p.Save(); <-- this is dangerous
}

我们使用

[WebMethod] 
public void SavePersonName(long personID, string name){
    Person p = GetPersonByID(personID);
    p.Name = name;
    p.Save();
}

我知道很多人会争辩说这将导致更多的编码以及更多的服务器往返,但是也可以通过使用专用包装类来避免往返。

在参数中使用包装类

// I will only define the fields I want to pass to server
// this needs to be done at backend level
class PersonAddressWrapper{
    long PersonAddressID;
    string AddressLine1;
    string AddressLine2;
    string ZipCode;
    string City;
    string Country;
}

class PersonWrapper{
    long PersonID;
    string Name;
    PersonAddressWrapper[] Addresses; 
}

[WebMethod]
public void SavePerson(PersonWrapper pw){
    Person p = GetPersonByID(pw.PersonID);
    p.Name = pw.Name;
    p.Save();
    foreach(PersonAddressWrapper paw in pw.Addresses){
        PersonAddress pa = GetPersonAddressByID(paw.PersonAddressID);
        Copy(pa,paw);
        pa.Save();
    }
}

这样您可以减少往返行程,您还可以组织包装类以包含/排除可以消除循环依赖及其安全性的项目。

是的,我知道这需要更多的工作,但这是安全的方法。

关于c# - 如何在 flex 中为 C# 后端序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1480072/

相关文章:

actionscript-3 - Loader.load 和 Loader.loadBytes 差异

actionscript-3 - 无法扩展 Sound 对象原型(prototype)

actionscript-3 - 如何在 Flash AS3 中检测碰撞检测?

c# - 将 TimeSpan 添加到给定的 DateTime

c# - 如何从 MatchCollection 中获取唯一元素

apache-flex - Flex 组合框隐藏和显示向下箭头

actionscript-3 - 将 MouseEvent.CLICK 添加到八哥图像

扩展方法中的 C# out 参数

c# - 两个值之间的正则表达式返回值?

actionscript-3 - TimerEvent 与 AS3/Flex 游戏中的 ENTER_FRAME?