我们正在开发一个应用程序,它有一个 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/