WCF序列化类型不匹配

时间:2010-08-26 13:44:58

标签: c# wcf serialization

我有一个对象,我们称之为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;
   }
}

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

3 个答案:

答案 0 :(得分:1)

我不得不在客户端重写我的转换方法并删除对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);

这有点烦人但是有效。

答案 1 :(得分:0)

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

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

    public SerializableObject()  
    {}  
}  

答案 2 :(得分:0)

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

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