WCF实体相关错误:远程终结点不再能识别此序列。这很可能是由于远程终结点上发生中止

项目中,服务端获取数据填充List后,通过WCF传递到Business的Proxy.cs时报错如下:
System.ServiceModel.CommunicationException:“远程终结点不再能识别此序列。这很可能是由于远程终结点上发生中止。WSRM:Identifier 的值不是已知的序列标识符。 可靠会话出错。”

经查代码,发现服务端代码并无问题。而问题出现在实体类中。

[Serializable]
[DataContract]
public class PatientInfo
{
		[DataField("SEX")]
        [DataMember]
        public EnumSex Sex { get; set; }

        /// <summary>
        /// 性别代码
        /// </summary>
        [DataMember]
    public int SexCode { get { return Sex.GetHashCode(); } }
}

以上代码,发现如果修改为

		/// <summary>
        /// 性别代码
        /// </summary>
        [Display(Name = "SexCode", Description = "性别代码")]
        [DataMember]
        public int SexCode { get { return 1; } }

依然会报此错误。因此推测使用WCF在服务端和客户端传递属性时候,使用 [DataMember] 标记的数据契约必须声明 Set 方法,未声明 Set 方法将抛出异常。

如下加上set即可

[DataMember]
public int SexCode { get { return Sex.GetHashCode(); }set{} }

当然如果发现我们实际也不需要传递这个属性的时候,那就直接把[DataMember]标记去掉就不会报错了。如下

public int SexCode { get { return Sex.GetHashCode(); } }

关于Enum枚举类型,如果操作不当也会出现类似问题,如下
请添加图片描述

原因,经查代码得知,没有给0默认值,这样一般常会出现未赋值的情况,则必定报错。
请添加图片描述

处理方式:
1.加上标记:默认值不序列化 [DataMember(EmitDefaultValue=false)](不建议)

// 当属性值为默认值时,不会参与序列化。
[DataMember(EmitDefaultValue=false)]
public EnumSex Sex { get; set; }

2.枚举必须给默认值0(强烈建议)

wcf相关文章:
知识宝典之介绍WCF数据契约
WCF三大契约使用说明
只读字段的WCF DataMember属性?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值