【问题标题】:DataContract and KnownTypes for Inherited classes using Service Bus 1.0使用 Service Bus 1.0 的继承类的 DataContract 和 KnownTypes
【发布时间】:2014-07-07 16:31:51
【问题描述】:

您好,我有以下类层次结构:

public class SuperJob{
}

public class JobA:SuperJob{
}

public class JobB:SuperJob{
}

当我尝试反序列化 SuperJob 时,我得到了

Expecting element 'SuperJob' from namespace 'http://schemas.datacontract.org/2004/07/...'.. Encountered 'Element'  with name 'JobA', namespace 'http://schemas.datacontract.org/2004/07/...'.

我的类注释如下:

[DataContract]
[KnownType(typeof(JobA))]
[KnownType(typeof(JobB))]
public class SuperJob{
}

[DataContract]
public class JobA:SuperJob{
}

[DataContract]
public class JobB:SuperJob{
}

不确定我做错了什么?有什么想法可以解决这个问题吗?

【问题讨论】:

标签: .net datacontractserializer datacontract servicebus known-types


【解决方案1】:

在您的服务上使用 [ServiceKnownType] 属性:

[ServiceKnownType(typeof(JobA))]
[ServiceKnownType(typeof(JobB))]
public interface IJobService 
{
.... methods
}

Another approach would be to pass knowntypes in DataContractSerializer constructor.

List<Type> knownTypeList = new List<Type>();
knownTypeList.Add(typeof(JobA));
knownTypeList.Add(typeof(JobB));

// Create a DatatContractSerializer with the collection.
DataContractSerializer ser2 = new DataContractSerializer(
                                  typeof(SuperJob), knownTypeList);

【讨论】:

    【解决方案2】:

    设法解决了这个问题,服务总线实例化串行器的方式存在错误。看起来在内部它用 JobA.getType() 实例化了序列化器。因此,最好的方法是创建您自己的 DataSerializer 对象,该对象使用 typeOf(JobA) 并在将消息发送到总线和读取总线时将其传递。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多