gpt4 book ai didi

c# - 为什么在从 ASMX Web 方法返回派生类对象时我的基类字段没有被序列化?

转载 作者:太空狗 更新时间:2023-10-29 23:26:28 24 4
gpt4 key购买 nike

我有两个类和一个 web 方法如下

[Serializable]
public class BaseClass
{
public int Key;
public bool IsModified;
public bool IsNew;
public bool IsDeleted;
}

[Serializable]
public class DerivedClass : BaseClass
{
public string Name;
}

[WebMethod]
public List<DerivedClass> GetDerivedClassObjects()
{

}

但是当我看到 SOAP 响应时,我没有看到基类中的字段。他们不应该被序列化吗?如果我想让它们连载,应该怎么做?

最佳答案

您可以从您的类中删除 [Serializable] 属性,没有它应该也能工作。 POCO 不需要属性存在,它们可以按原样很好地序列化。

编辑:您是否真的检查过网络服务输出是什么,或者您只是在查看服务网络端点上的消息定义?

我可以看到当您浏览到浏览器中的服务端点时生成的 SOAP 消息格式似乎对基类字段一无所知:

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetDerivedClassObjectsResponse xmlns="http://tempuri.org/">
<GetDerivedClassObjectsResult>
<DerivedClass>
<Name>string</Name>
</DerivedClass>
<DerivedClass>
<Name>string</Name>
</DerivedClass>
</GetDerivedClassObjectsResult>
</GetDerivedClassObjectsResponse>
</soap:Body>
</soap:Envelope>

但是当您使用测试表单或 Storm 调用 Web 服务时,类被序列化:

<DerivedClass>
<Key>1</Key>
<IsModified>true</IsModified>
<IsNew>true</IsNew>
<IsDeleted>true</IsDeleted>
<Name>Test1</Name>
</DerivedClass>

visual studio 的“添加 Web 引用”对话框也会正确创建代理类。

编辑 2:查看为我们生成的 Web 服务定义 (service.asmx?wsdl),我们可以看到该定义保留了原始的继承层次结构,而不是将对象扁平化为它在序列化过程中的字段:

<s:complexType name="DerivedClass">
<s:complexContent mixed="false">
<s:extension base="tns:BaseClass">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
<s:complexType name="BaseClass">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Key" type="s:int" />
<s:element minOccurs="1" maxOccurs="1" name="IsModified" type="s:boolean" />
<s:element minOccurs="1" maxOccurs="1" name="IsNew" type="s:boolean" />
<s:element minOccurs="1" maxOccurs="1" name="IsDeleted" type="s:boolean" />
</s:sequence>
</s:complexType>

有趣的是,在服务端点生成的示例消息似乎没有考虑扩展名。但对于所有其他效果和目的,您的代码应该有效。

关于c# - 为什么在从 ASMX Web 方法返回派生类对象时我的基类字段没有被序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com