超全模态模型 × Harness 升级,升级解锁 ArkClaw,最新支持 DeepSeek-V4 系列与 GLM-5.1
你的SomeObjectClass.Values是List<object>,期望根据version参数分别容纳string或FilterClass实例,但WCF的DataContractSerializer无法自动将JSON中的对象映射为FilterClass,导致类型转换失败。
SomeObjectClass.Values
List<object>
version
string
FilterClass
DataContractSerializer
你的请求里"Source "字段名末尾多了一个空格,而FilterClass中SourceString对应的DataMember(Name = "Source")没有空格,字段名不匹配会直接导致反序列化失败。修改请求中的字段名:
"Source "
SourceString
DataMember(Name = "Source")
{ "Source": "ABC", "SomeBool": true }
KnownType
当前SomeObjectClass仅声明了List<string>和List<FilterClass>的KnownType,但Values是List<object>,其中的元素是单个的string或FilterClass,而非它们的列表。需要补充单个类型的KnownType:
SomeObjectClass
List<string>
List<FilterClass>
Values
[DataContract] [KnownType(typeof(string))] [KnownType(typeof(FilterClass))] // 保留原有List类型的KnownType(若存在传递列表作为元素的场景) [KnownType(typeof(List<string>))] [KnownType(typeof(List<FilterClass>))] public class SomeObjectClass { // ... 原有代码 }
FilterClass的SourceString属性只有private set,DataContractSerializer需要属性具备公共setter(或内部setter配合[DataMember])才能正确赋值。同时SourceEnum被标记为[IgnoreDataMember],会导致SourceString的getter逻辑因枚举值未初始化而返回null。修改如下:
private set
[DataMember]
SourceEnum
[IgnoreDataMember]
[DataContract] public class FilterClass { private string sourceString; [DataMember(Name = "Source", IsRequired = true)] public string SourceString { get { if (string.IsNullOrWhiteSpace(sourceString)) { sourceString = Enum.GetName(typeof(Source), this.SourceEnum); } return sourceString; } // 改为公共setter,并同步更新枚举值 set { sourceString = value; if (Enum.TryParse<Source>(value, out var enumValue)) { SourceEnum = enumValue; } } } // 若需要序列化枚举,去掉IgnoreDataMember或添加DataMember映射 public Source SourceEnum; [DataMember(Name = "Names", IsRequired = false)] public List<string> Names; [DataMember(Name = "SomeBool", IsRequired = true)] // WCF默认不识别JsonPropertyName,移除该属性 public bool SomeBool; }
如果上述修改仍无法解决问题,可以在API方法内部获取原始请求流,用Newtonsoft.Json手动反序列化:
public async Task<SomeResultClass> FooBar(string scenario, string version, List<SomeObjectClass> filters) { // 获取原始请求内容 var context = WebOperationContext.Current; var requestStream = context.IncomingRequest.ContentStream; requestStream.Position = 0; using var reader = new StreamReader(requestStream); var rawJson = await reader.ReadToEndAsync(); // 用Newtonsoft.Json反序列化为强类型对象 var request = JsonConvert.DeserializeObject<FooBarRequest>(rawJson); // 处理FilterClass实例 if (version == "1") { foreach (var filter in request.filters) { if (filter.Name == "Prop2") { var filterObj = filter.Values.FirstOrDefault() as FilterClass; // 此时可正常访问FilterClass的属性 } } } // ... 原有业务逻辑 } // 定义匹配请求结构的强类型类 public class FooBarRequest { public string scenario { get; set; } public string version { get; set; } public List<SomeObjectClass> filters { get; set; } }
如果你的服务使用WebHttpBinding,可以配置使用Newtonsoft.Json替代默认的DataContractJsonSerializer,提升复杂类型的序列化兼容性:
WebHttpBinding
DataContractJsonSerializer
Microsoft.AspNet.WebApi.Extensions.DependencyInjection
<system.serviceModel> <extensions> <behaviorExtensions> <add name="webHttpJson" type="Microsoft.AspNet.WebApi.Extensions.DependencyInjection.WebHttpJsonBehaviorExtension, Microsoft.AspNet.WebApi.Extensions.DependencyInjection" /> </behaviorExtensions> </extensions> <behaviors> <endpointBehaviors> <behavior> <webHttpJson /> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel>
内容的提问来源于stack exchange,提问作者ArvN
超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起
模型再升级,30秒超长叙事, 模态参考扩容
模型自由,工具不限,最新支持 Deepseek-V4 系列、GLM-5.3 系列
超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列
大模型19元起,Al应用9.9元畅享,新人首购爆款尽享优惠