Сериализация структуры в общем компаненте.

 
0
 
.NET
ava
Мурлыкатам_ | 18.11.2007, 16:57
Подскажите плз:
1. Хочу от клиента серверу передавать данные в виде структуры (пакета информации).
2. Для этого делаю структуру в общем компоненте для сервера и клиента, а мне компилятор пишет, что структуру невозможно сериализовать, как с этим бороться? и стоит ли?

Или проще (все данные типа стринг) сплюсовать всё в одну строку, а на стороне сервера ее разобрать?
Comments (10)
ava
1stain | 18.11.2007, 19:58 #
Цитата (Мурлыкатам_ @ 18.11.2007, 16:57 findReferencedText)
структуру невозможно сериализовать, как с этим бороться? и стоит ли?

бороцца с этим безусловно стоит. А вся борьба скорее всего будет заключатся в применении к структуре атрибута SerializableAttribute
Если атрибут уже все-таки применили, то желательно посмотреть код структуры
ava
Мурлыкатам_ | 19.11.2007, 19:29 #
А недостаточно метки [Serializeble] ?

И вообще, что такое сериализация в целом и почему это явление накладывает ограничения на работу с удаленными объектами?
Структуры же не поддерживают наследование?

Или может лучше просто сделать класс... Объект класса ведь можно передать в функцию как параметр?
ava
tol05 | 20.11.2007, 16:54 #
Цитата (Мурлыкатам_ @ 19.11.2007, 18:29 findReferencedText)
И вообще, что такое сериализация в целом и почему это явление накладывает ограничения на работу с удаленными объектами?

Структуры же не поддерживают наследование?

не понял к чему это? Серилизация - это сохранение состояния (данных) в поток. Тип Int32 - структура, тоже не поддерживает наследования, но он же серилизуем!..

Цитата (Мурлыкатам_ @ 19.11.2007, 18:29 findReferencedText)
А недостаточно метки [Serializeble] ?

не всегда. Эсли структура содержит поля только серилизуемых типов, тогда да, достаточно. Но если

struct S
{
int x;
bool b;
MyClass myC; //А этот класс не поддерживает серилизацию!
}

тогда хоть есть [Serializeble], хоть нет ... структура не будет серилизована. Поэтому и
Цитата (1stain @ 18.11.2007, 18:58 findReferencedText)
желательно посмотреть код структуры


Цитата (Мурлыкатам_ @ 19.11.2007, 18:29 findReferencedText)
Или может лучше просто сделать класс... Объект класса ведь можно передать в функцию как параметр?
это не имеет никакого значения. Смотри предыдущее предложение.
ava
Мурлыкатам_ | 22.11.2007, 19:38 #
Цитата


это не имеет никакого значения. Смотри предыдущее предложение.



почему не имеет, сделаю класс: MarshalByRefObject. И все никаких проблем с удаленным взаимодействием.

Клиент вызывает удаленный метод класса и передает в него как параметр следующую структуру:

struct ClientSendedData
{
int NumberOfSendingFiles;
string ClientUNC;
string[] FileAttributes;
byte[] FileContent;
bool ReWrite;
}
Данная структура записывается в удаленный класс, тот извращается над ней как ему надо, и дает знать, что готов принять следующую структуру. Так вот когда я пытаюсь передать эту структуру как параметр, Мне пишет ошибку - незя так делать, структура не сериализируема.
ava
tol05 | 22.11.2007, 19:53 #
ну а где атрибут [Serializable] ???
Ты же об это говорил

Цитата (Мурлыкатам_ @ 19.11.2007, 18:29 findReferencedText)
А недостаточно метки [Serializeble] ?



....



Или может лучше просто сделать класс
... Объект класса ведь можно передать в функцию как параметр?


если нужно передать что-то куда-то, то:
- для структур и классов можно юзать [Serializable] - тип маршаллизуется по значению
или
- для классов можно юзать наследование от MarshalByRefObject (для структур нельзя, это понятно) - тип маршаллизуется по ссылке
больше вариантов нет

Вот я и говорил.
Что.
Если ты юзаешь [Serializable], то можно и не делать классом. Класс это или структура - значения не имеет.

ava
Мурлыкатам_ | 23.11.2007, 23:56 #
Ясно.
Решил все параметры клеить в строку, передавать строку и байтовый массив smile
Че париться?! :biggrin

Спасибо за помощь, надо почитать про сериализацию, потомучто я это слово никак не могу осознать..
ava
1stain | 24.11.2007, 00:04 #
Мурлыкатам_, если это "не парицца", то что оно тогда по-твоему?
ava
Мурлыкатам_ | 25.11.2007, 19:14 #
Цитата (1stain @ 24.11.2007, 00:04 findReferencedText)
Мурлыкатам_, если это "не парицца", то что оно тогда по-твоему?


В смысле?
ava
1stain | 25.11.2007, 20:57 #
Мурлыкатам_, назначение сериализации как раз в том и состоит, чтобу унифицировать сохранение состояния объекта и создание нового объекта из сохраненной информации. При этом не надо писать свои парсеры.
Если тебе больше нравицца писать парсер - ради бога. Только учти, что в это как раз и есть "париться".
ava
Мурлыкатам_ | 27.11.2007, 14:51 #
А че такое парсер?

Все получилось со структурой.


[Serializable]
public struct Package
{
public int a;
public int b;
public byte[] content;
public string name;
}

public void GetPack(Package pk)
{
Console.WriteLine("invoked");

Package pg = new Package();
pg.content = pk.content;
Console.WriteLine("pk.a = " + pg.a);
Console.WriteLine("pk.content.length = " + pg.content.Length);

}


Как я понял вызывающая сторона должна инициализировать все поля структуры?
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit