返回类型对象的序列化属性 [英] Serialize property of return type object

查看:57
本文介绍了返回类型对象的序列化属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好专家,

在wcf服务中,我有数据合同.具有返回类型的数据协定属性之一是对象".我该如何序列化此合同.请参阅下面的合同和财产项目.我需要序列化此合同.我做了一些谷歌搜索,并尝试使用serviceknown类型属性,但还没有走运.如果我使用此合同,则服务器将被强制关闭.当然,我知道这是因为对象返回类型.我可以将此属性设置为通用属性还是任何其他解决方案?

Hello experts,

In wcf service, I have data contract. One of the data contract property having return type is ''object''. How could I serialize this contract. See below contract and property item. I need to serialize this contract. I did some googling and tried with serviceknown type attributes but no luck yet. If I use this contract, my server is forcefully closed. Of course, I know this is because of object return type. Can I make this property generic OR any other solution?

[DataContract]
    public class Message
    {
        private string messageIdField;
        private MessageOperationType operationTypeField;
        private object itemField;
        [DataMember]
        public string MessageId
        {
            get
            {
                return this.messageIdField;
            }
            set
            {
                this.messageIdField = value;
            }
        }
        [DataMember]
        public MessageOperationType OperationType
        {
            get
            {
                return this.operationTypeField;
            }
            set
            {
                this.operationTypeField = value;
            }
        }
        [DataMember]
        public object Item
        {
            get
            {
                return this.itemField;
            }
            set
            {
                this.itemField = value;
            }
        }
    }

推荐答案

ServiceKnownType [ ^ ]总是为我做窍门.诚然,我不使用object作为返回类型,但是我经常将接口与ServiceKnownType属性结合使用.

我假设没有通用的接口可以实现您所返回的对象的类,否则您将这样声明您的Item属性.在这种情况下(例如,当我必须从不相交的类层次结构返回对象时),我使用可怜的人的变体"实现,如下所示:
ServiceKnownType[^] always does the trick for me. Admittedly, I do not use object as my return type, but I often use interfaces in conjunction with ServiceKnownType attributes.

I assume that there is no common interface that the classes of the objects that you return would implement, otherwise you would declare your Item property as such. In cases like that (i.e. when I must return objects from disjoint class hierarchies) I use "poor man''s variant" implementation, which looks as follows:
[DataContract]
public class ReturnType1 {...}
[DataContract]
public class ReturnType2 {...}
[DataContract]
public class ReturnType3 {...}

[DataContract]
public class ReturnVariant {
   [DataMember] private ReturnType1 RetMember1 {get; set}
   [DataMember] private ReturnType2 RetMember2 {get; set}
   [DataMember] private ReturnType3 RetMember3 {get; set}
   public object Item {
      get {
          return RetMember1 ?? RetMember2 ?? (object)RetMember3;
      }
   }
   public ReturnVariant(object item) {
       if (item is ReturnType1) RetMember1 = (ReturnType1)item;
       else if (item is ReturnType2) RetMember2 = (ReturnType2)item;
       else if (item is ReturnType3) RetMember3 = (ReturnType3)item;
       else throw new ArgumentException("item");
   }
}

使用ReturnVariant封装对象.


这篇关于返回类型对象的序列化属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆