C#WCF对象[]成员类型序列化

时间:2016-11-02 10:30:30

标签: c# wcf

如何允许类似这样的类的通信(WCF):

[DataContract]
public class Sample
{
    [DataMember]
    public object[] Values { get; set; }
}

'object'不能直接序列化......但是考虑到具体的盒装值可以是'int','double','string','DataTime',如何让它工作?

2 个答案:

答案 0 :(得分:0)

简单答案:使用具体的可序列化类型。

复杂答案:

数据的网络传输要求在连接的任何一端准确地重新创建对象所需的所有信息都需要传输,以便序列化成功。这就是需要使用具体的可序列化类型的原因。

答案 1 :(得分:0)

最后,我找到了一种简单的方法。

我知道“KnownType”属性,但我没想到它会在那种情况下工作,因为我认为这个属性是指定整个成员类型(即“object []”)而不是数组中的每个对象值。

但它似乎工作得非常好,因为序列化对每个未知值使用了已知类型。

因此,例如,这很有效:

[DataContract]
[KnownType( typeof( int ) )]
[KnownType( typeof( double ) )]
[KnownType( typeof( string ) )]
[KnownType( typeof( Sample ) )]
[KnownType( typeof( List<object> ) )]
public class Sample
{
    [DataMember]
    public object[] Values { get; set; }
}

并允许Values [i]为int,double,string,Sample本身或任何List&lt;&gt;以前的类型。

在发现之前,我正在研究一种解决方法,它也有效,但编码时间有点长。原则是从'Values'成员中删除DataMember属性并添加另一个成员来编码序列化:

[DataContract]
public class Sample
{
    public object[] Values { get; set; }

    [DataMember]
    public byte[] SerializableValues
    {
        get
        {
            try
            {
                return ToBytes( Values );
            }
            catch ( Exception e )
            {
                return null;
            }
        }

        set
        { 
            try
            {
                Values = FromBytes( value );
            }
            catch ( Exception e )
            {
                Values = null;
            }
        }
    }
}