Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Несовместимость собственных классов


Автор: azz 27.3.2007, 13:19
Скажем у меня есть класс LetterInfo - Сереалезуемый только за счет <Serializable()> в начале. Он находится в нэймспейс olexiy.shared, и используется как пораметр для WebMetod.
Но почемуто когда я пытаюсь вызвать метод из клиента то получаю несовместимость типов olexiy.LetterInfo и olexiy.LocalPostServer.LetterInfo. Почему и что мне делать???

Автор: ivashkanet 27.3.2007, 13:33
azz, сериализация бинарная?
Тогда недостаточно,  чтобы совпадала сигнатура классов, нужно чтобы это был один и тот же класс из той же самой сборки

Автор: Naum 27.3.2007, 13:35
ivashkanet, что значит "бинарная"? А какие еще могут быть?

Автор: ivashkanet 27.3.2007, 13:41
Naum, XML  smile 
XML съест все что угодно, лишь бы поля принимающего класса соответствовали и, возможно, имя класса.
Она не пишет никакие данные о классе и сборке.

Вот пример сериализации класса Settings
Код

<?xml version="1.0" encoding="utf-8"?>
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ConnectionString>Data Source=localhost;Persist Security Info=True;User ID=****;Password=*****;Unicode=True</ConnectionString>
  <UpdateTimerInterval>120</UpdateTimerInterval>
  <DefaultWorkCentreID>***</DefaultWorkCentreID>
</Settings>


Как видно никаких данных кроме названия класса, и сериализованных данных нет

Автор: azz 27.3.2007, 13:42
Насколько я знаю в случае с WS сереализация всегда в XML. Класс один и тот же. У меня папка из 3-х проектов: клиент, сервер и общая, где лежат файлы которые должны иснользаватся обоими. С Enum например проблем нет

Автор: ivashkanet 27.3.2007, 13:54
Цитата(azz @  27.3.2007,  12:42 Найти цитируемый пост)
Класс один и тот же.

А как тогда неймспейсы стали разными?

Цитата(azz @  27.3.2007,  12:19 Найти цитируемый пост)
получаю несовместимость типов

Ошибку в студию

Автор: azz 27.3.2007, 14:01
Цитата

    
Цитата(azz @  27.3.2007,  12:42 Найти цитируемый пост)
Класс один и тот же.

А как тогда неймспейсы стали разными?

А вот это и является собственно моим вопросом.  smile 

Ошибка : (не неметском языке)
Der Wert vom Typ "olexiy.Shared.LetterInfo" kann nicht zu "olexiy.EMPost.LocalPostServer.LetterInfo" konvertiert werden

Автор: ivashkanet 27.3.2007, 14:14
Цитата(azz @  27.3.2007,  13:01 Найти цитируемый пост)
Der Wert vom Typ "olexiy.Shared.LetterInfo" kann nicht zu "olexiy.EMPost.LocalPostServer.LetterInfo" konvertiert werden 

Мне б на китайском...  smile 
Цитата(azz @  27.3.2007,  13:01 Найти цитируемый пост)
А вот это и является собственно моим вопросом.

Какая религия мешает использовать один и тот же класс в том же самом неймспейсе? 

Автор: azz 27.3.2007, 15:07
Да блин в том то и дело!!!!!

Вот WS:

Imports  olexiy.shared

.....
<WebMetod()>_
Public Sub PostLetter(ByVal info as LetterInfo)

....
End Sub

Вот клиент

private mPostService as LocalPostService.Service

public sub SendLetter(ByVal info as LetterInfo)
 mPostService.PostLetter(info)
end sub

как видеш один и тот клже класс

Автор: ivashkanet 27.3.2007, 15:25
Цитата(azz @  27.3.2007,  14:07 Найти цитируемый пост)
как видеш один и тот клже класс 

НЕ ВИЖУ  smile 
С точки зрения управляющей среды это разные классы. Ну и что, что ты знаешь, что это одно и то же. Ну и что, что ты просто скопипастил код одного в другой.
Для машины они разные!!!!
Цитата(azz @  27.3.2007,  13:01 Найти цитируемый пост)
"olexiy.Shared.LetterInfo" ....  "olexiy.EMPost.LocalPostServer.LetterInfo"



Создавай dll, ложи в нее общие классы и используй их на клиенте и на сервере.

Если планируешь менять классы, то лучше выдели необходимый интерфейс и реализуй его в обоих классах

Автор: azz 27.3.2007, 15:58
Блииииииин!!!!!да я так и сделал!!!!!!! Ти издеваешса или хе понимаеш????? У мена есть толко один клвсс. а WS ego naruju kak drugoj vidaet. Sam poprobuj

Автор: arilou 27.3.2007, 16:18
Цитата(azz @  27.3.2007,  15:58 Найти цитируемый пост)
Блииииииин!!!!!да я так и сделал!!!!!!! Ти издеваешса или хе понимаеш????? У мена есть толко один клвсс. а WS ego naruju kak drugoj vidaet. Sam poprobuj 

Это потому что из клиента ты общаешься не с самим классом, а с его прокси, который создается автоматически при добавлении web reference в проект.

По идее, когда ты добавляешь эту ссылку, все необходимые тебе для работы классы автоматом генерятся, и ставить ссылку на olexiy.shared не надо.

Автор: azz 27.3.2007, 16:22
то есть вариант - использовать в клиенте только прокси?? 

Автор: ivashkanet 27.3.2007, 16:48
Цитата(azz @  27.3.2007,  14:58 Найти цитируемый пост)
Блииииииин!!!!!да я так и сделал!!!!!!! Ти издеваешса или хе понимаеш????? У мена есть толко один клвсс. а WS ego naruju kak drugoj vidaet. Sam poprobuj 

Я конечно дико извиняюсь, но как я мог понять, что ты так и делаешь????? Из твоего куска кода не понятно что это один объект.
Из ошибки видно, что это разные объекты!!!!!
А это потому, что ты один из классов в ошибке твой, а второй --- прокси (я это не знал, но arilou).
Ты мог сказать, что не создавал "olexiy.EMPost.LocalPostServer.LetterInfo"?

P.S. Каждую толику информации из тебя нужно вытягивать клещами.

Автор: arilou 27.3.2007, 16:52
Цитата(azz @  27.3.2007,  16:22 Найти цитируемый пост)
то есть вариант - использовать в клиенте только прокси?? 

Да.

Автор: azz 28.3.2007, 12:07
А если в класе кроме свойств и функции есть, будет работаь?

Автор: mr.DUDA 28.3.2007, 17:09
Как показала практика, класс сгенерированный с пом. wsdl (или в студии) из веб-сервиса, ничем кроме имён свойств не относится к классу, который юзается на сервере.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)