2010-08-26 62 views
2

我有一个对象,我们称之为UnSerializableObject,我不能改变我需要序列化。所以我创建了自己的SerializableObject对象,它是可序列化的,并包含与原始对象相同的所有数据。这看起来是这样的:WCF序列化类型不匹配

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转换:\项目\客户\客户端\ test.Utilities.dll]”到 'test.Utilities.SerializableObject [C:\项目\客户\客户\ Service.cs(19)]'

​​

为什么会出现这种情况?我该如何解决它?有没有更好的方法来处理这个问题?

+0

你可以发布ObjectConverter.ToSerializableObject方法的原型吗? – 2010-08-26 13:55:23

+0

我已经添加了。有更多的属性,但基本上这是。 – scott 2010-08-26 14:34:47

回答

0

当您添加默认服务引用它创建与您的服务引用的命名空间的结构相同的新对象。如果您想使用共享转换器,则必须共享对象,并在服务引用期间重用它。

Btw。 WCF支持用于封装不可序列化对象的基础结构。检查IDataContractSuroggate

+0

您能否提供更多关于共享转换器的信息或指向资源获取更多信息?我找不到任何。提前致谢。 – rpattabi 2011-06-16 05:47:08

0

请确保您的客户端和服务器都引用了包含SerializableObject类定义的公共项目。除此之外,你的类如下:

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

    public SerializableObject() 
    {} 
} 
+0

没有工作。我得到我想要的数据,这有助于。但我仍然有同样的错误。 – scott 2010-08-26 14:48:08

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); 

这是一种恼人的,但它的工作原理。