【问题标题】:InvalidCastException with serializer带有序列化程序的 InvalidCastException
【发布时间】:2014-03-26 12:20:15
【问题描述】:

这个问题有什么附加条件?

[A]SampleAzureWorker.DTO.SampleConfigScheduler 无法转换为 [B]SampleAzureWorker.DTO.SampleConfigScheduler。 A型起源于 'samplerestfull,版本=1.0.0.0,文化=中性, PublicKeyToken=null' 在字节数组中的上下文“LoadNeither”中。 B 型源自 'SampleAzureWorker, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 在上下文 'LoadNeither' 中 一个字节数组。

【问题讨论】:

  • 请附上代码,显示您正在序列化的方式和内容,以便我们有更好的机会提供帮助。
  • .Net 序列化程序(尤其是 BinaryFormatter)记录正在序列化的类的程序集 (dll) 名称。如果源 dll 不匹配(您有两个具有相同 FQN 的类,但来自不同的程序集),它将抱怨反序列化。
  • 我正在使用 DataContractSerializer。那么我应该实施另一个策略序列化,还是有 DataContractSerialiezer 类的解决方案?

标签: c#


【解决方案1】:

您是否尝试使用基本类型来回传递数据?

意思是我有一个类叫

[DataContract]
public class Data {}

[DataContract]
public class NetworkMessage 
{
    [DataMember]
    public Data MyData { get; set; }
}

[DataContract]
public class Foo : Data
{
    [DataMember]
    public int SomeId { get; set; }
}

[DataContract]
public class Bar : Data
{
    [DataMember]
    public string FirstName { get; set; }
}

如果您的 WCF 服务正在使用 NetworkMessage,那么序列化将失败。您可以使用KnownType 属性来解决此问题。

[DataContract]
[KnownType(typeof(Foo))]
[KnownType(typeof(Bar))]
public class Data {}

[DataContract]
public class NetworkMessage 
{
    [DataMember]
    public Data MyData { get; set; }
}

[DataContract]
public class Foo : Data
{
    [DataMember]
    public int SomeId { get; set; }
}

[DataContract]
public class Bar : Data
{
    [DataMember]
    public string FirstName { get; set; }
}

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多