Несовпадение типов сериализации WCF - PullRequest
2 голосов
/ 26 августа 2010

У меня есть объект, давайте назовем его 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] 'to' 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 ]

1 голос
/ 26 августа 2010

Мне пришлось переписать мой метод преобразования на стороне клиента и удалить ссылки на 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);

, что немного раздражает, но работает.

0 голосов
/ 26 августа 2010

Когда вы добавляете ссылку на службу, она по умолчанию создает новый объект с такой же структурой в пространстве имен ссылки на службу.Если вы хотите использовать разделяемый конвертер, вы также должны совместно использовать объект и повторно использовать его во время обращения к сервису.WCF поддерживает инфраструктуру для упаковки не сериализуемых объектов.Проверьте IDataContractSuroggate .

0 голосов
/ 26 августа 2010

Пожалуйста, убедитесь, что и ваш клиент, и ваш сервер ссылаются на общий проект, который содержит определение вашего класса SerializableObject. Кроме того, отметьте свой класс, как показано ниже:

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

    public SerializableObject()  
    {}  
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...