2011-12-16 107 views
3

我很反感,我还没有找到答案的反序列化问题。该场景如下:如何反序列化不知道的类型,而不是普通的情况

silverlight客户端登录到服务器并获取会话对象。会话对象包含各种信息,其中包括一个名为UserSettings的集合。该集合包含一个名为propertyentity的类型,它基本上有两个属性,一个字符串和一个对象。反序列化时,我得到了以下错误:

System.Runtime.Serialization.SerializationException: JSON contains a '__type' member specifying the data contract name 'http://www.xyz.se/rc:ClientDifferenceRules'. The deserializer has no knowledge of any type that maps to this contract. Add the type corresponding to 'ClientDifferenceRules' to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding it to the list of known types passed to DataContractSerializer. You can also often eliminate this error by avoiding the use of derived types where the JSON is produced.

当含有例如普通INT作为反序列化的作品完美session.UserSettings发送其它propretyentities。我怎样才能告诉解串器它是什么数据类型?

ClientDifferenceRules看起来是这样的:

using System; 
using System.Diagnostics; 
using System.Text; 
using System.ComponentModel; 
using System.Runtime.Serialization; 

    namespace XYZ.BusinessEntities.Settings 
    { 

    [Serializable] 
    [DataContract(Name = "ClientDifferenceRules", Namespace = Constants.Namespace)] 
    [KnownType(typeof(ClientDifferenceRules))] 
    public class ClientDifferenceRules : RCBusinessBase 
    { 
     //private fields omitted for better readability 

     public ClientDifferenceRules() : base() 
     { 
     } 

     [DataMember] 
     public override int Id 
     { 
      get { return _levelId;} 
      set { } 
     } 

     [DataMember] 
     public int clientId 
     { 
      get { return _clientId;} 
      set { _clientId = value;} 
     } 

     [DataMember] 
     public int typeId 
     { 
      get { return _typeId; } 
      set { _typeId = value; } 
     } 

     [DataMember] 
     public short levelId 
     { 
      get { return _levelId; } 
      set { _levelId = value; } 
     } 

     [DataMember] 
     public double? limitFrom 
     { 
      get { return _limitFrom; } 
      set { _limitFrom = value; } 
     } 

     [DataMember] 
     public double? limitTo 
     { 
      get { return _limitTo; } 
      set { _limitTo = value; } 
     } 

     [DataMember] 
     public string message 
     { 
      get { return _message; } 
      set { _message = value; } 
     } 

     [DataMember] 
     public string description 
     { 
      get { return _description; } 
      set { _description = value; } 
     } 

     [DataMember] 
     public string backColor 
     { 
      get { return _backColor; } 
      set { _backColor = value; } 
     } 

     [DataMember] 
     public string foreColor 
     { 
      get { return _foreColor; } 
      set { _foreColor = value; } 
     } 

     [DataMember] 
     public string imageUri 
     { 
      get { return _imageUri; } 
      set { _imageUri = value; } 
     } 


     [DataMember] 
     public DifferenceType differenceType 
     { 
      get 
      { 
       DifferenceType enmType = (DifferenceType)this.typeId; 
       return enmType; 
      } 
      set { this.typeId = (int)value; } 

     } 

     [DataMember] 
     public DifferenceLevel differenceLevel 
     { 
      get 
      { 
       DifferenceLevel enmLevel = (DifferenceLevel)this.levelId; 
       return enmLevel; 
      } 
      set { this.levelId = (short)value; } 
     } 

    } 
} 

ClientDifferenceRulesCollection看起来是这样的:

using System; 
using System.Text; 
using System.Collections.Generic; 
using Momentum.Common.Framework; 
using System.Runtime.Serialization; 

namespace XYZ.RC.BusinessEntities.Settings 
{ 
    [Serializable] 
    [CollectionDataContract(Name = "ClientDifferenceRulesCollection", Namespace = Constants.Namespace)] 
    [TypedCollection(typeof(ClientDifferenceRules))] 
    [KnownType(typeof(ClientDifferenceRulesCollection))] 
    public class ClientDifferenceRulesCollection : BusinessCollectionBase<ClientDifferenceRules> 
    { 
     public ClientDifferenceRulesCollection() : base(){}  
     public ClientDifferenceRulesCollection(UserSession Session) : base(Session){}  
     public ClientDifferenceRulesCollection(IList<ClientDifferenceRules> initialList) : base(initialList) { } 
    } 
} 

PropertyEntity看起来像这样(从元数据):

[DataContract(Name = "PropertyEntity", Namespace = "http://www.momentum.se//common")] 
public class PropertyEntity 
{ 
    public PropertyEntity(); 
    public PropertyEntity(string name, object value); 

    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public object Tag { get; set; } 
    public TypeCode typeCode { get; set; } 
    [DataMember] 
    public TypeOfProperty TypeOfProperty { get; set; } 
    [DataMember] 
    public object Value { get; set; } 
} 
+0

知识类型通常在基类(或其集合)上进行多态序列化。您可能需要向RCBusinessBase和/或任何集合添加[KnownType(typeof(ClientDifferenceRules))]。您也可以在Web配置中添加已知类型,并且似乎声明性地向您的服务合同提供 - http://stackoverflow.com/questions/771560/how-do-you-configure-wcf-known-types-programmatically – StuartLC 2011-12-16 09:18:05

回答

0

我放弃了试图解决这个问题与未知类型的反序列化并重新设计了应用程序而不是。看起来它只是自己设计的实体和集合的层次太多,以至于序列化/反序列化机制无法处理。

现在我通过单独的WCF服务在集合中获取类型为X的实体,它的工作原理类似于魅力。

无论如何感谢您的努力!

相关问题