繁体   English   中英

WCF序列化类型不匹配

[英]WCF Serialization Type mismatch

我有一个对象,让我们称它为UnSerializableObject,我不能更改它并需要序列化。 因此,我创建了自己的名为SerializableObject的对象,该对象可序列化,并包含与原始对象相同的所有数据。 看起来像这样:

namespace test  
[Serializable]  
class SerializableObject  
{  
    private int item1;  
    public int Item1  
    {  
        get;  
        set;  
    }  
    public SerializableObject()  
    {}  
}  

然后,我创建了另一个类,该类在SerializableObject和UnSerializableObject之间进行转换。 在服务方面,一切正常。 服务中的方法将SerializableObject作为参数,然后将其转换为UnSerializableObject。 问题出在客户端。 我使用svcutil创建客户端代码。 然后,我将一个Object转换为SerializableObject并在服务调用中使用SerializableObject。 像这样:

  TTSServiceClient aClient = new TTSServiceClient(); 
        UnSerializableObject loMMessage = new MostMessage();
        SerializableObject loSMMessage = ObjectConverter.ToSerializableObject(loMMessage);
        aClient.Allocate_OnStartResultAck(loSMMessage);

当我编译客户端时,出现错误:

错误59参数“ 1”:无法从“ test.Utilities.SerializableObject [c:\\ Projects \\ Client \\ Client \\ test.Utilities.dll]”转换为“ test.Utilities.SerializableObject [C:\\ Projects \\ Client \\ Client \\ Service.cs(19)]”

static Class ObjectConverter
{
   static public SerializableObject ToSerializableObject(UnSerializableObject usObject)
   {   
        SerializableObject sObject = new SerializableObject();
        sObject.Item1 = usObject.Item1;
        return sObject;
   }
}

为什么会这样呢? 以及如何解决? 有没有更好的方法来解决这个问题?

我必须在客户端重写我的转换方法,并删除对test.utilities.dll的引用。 所以本质上这

TTSServiceClient aClient = new TTSServiceClient(); 
UnSerializableObject loMMessage = new MostMessage();
SerializableObject loSMMessage = ObjectConverter.ToSerializableObject(loMMessage);
aClient.Allocate_OnStartResultAck(loSMMessage);

成为

TTSServiceClient aClient = new TTSServiceClient(); 
UnSerializableObject loMMessage = new MostMessage();
SerializableObject loSMMessage = new SerializableObject();
loSMMessage.Item1 = loMMessage.Item1;
aClient.Allocate_OnStartResultAck(loSMMessage);

这有点烦人,但可以。

请确保您的客户端和服务器都引用公共项目,该项目包含SerializableObject类的定义。 此外,将您的课程标记为以下内容:

[Serializable]  
[DataContract()]
class SerializableObject  
{  
    [DataMember()]
    public int Item1  
    {  
        get;  
        set;  
    }  

    public SerializableObject()  
    {}  
}  

添加服务引用时,默认情况下,它会在服务引用的名称空间中创建具有相同结构的新对象。 如果要使用共享转换器,则还必须共享对象并在服务引用期间重用它。

顺便说一句。 WCF支持用于包装不可序列化对象的基础结构。 检查IDataContractSuroggate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM