Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Сериализация структуры в общем компаненте.


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

Или проще (все данные типа стринг) сплюсовать всё в одну строку, а на стороне сервера ее разобрать?

Автор: 1stain 18.11.2007, 19:58
Цитата(Мурлыкатам_ @  18.11.2007,  16:57 Найти цитируемый пост)
 структуру невозможно сериализовать, как с этим бороться? и стоит ли?

бороцца с этим безусловно стоит. А вся борьба скорее всего будет заключатся в применении к структуре атрибута SerializableAttribute 
Если атрибут уже все-таки применили, то желательно посмотреть код структуры

Автор: Мурлыкатам_ 19.11.2007, 19:29
А недостаточно метки [Serializeble] ?

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

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

Автор: tol05 20.11.2007, 16:54
Цитата(Мурлыкатам_ @  19.11.2007,  18:29 Найти цитируемый пост)
И вообще, что такое сериализация в целом и почему это явление накладывает ограничения на работу с удаленными объектами?
Структуры же не поддерживают наследование?

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

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

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

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

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


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

Автор: Мурлыкатам_ 22.11.2007, 19:38
Цитата

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


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

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

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

Автор: tol05 22.11.2007, 19:53
ну а где атрибут [Serializable] ???
Ты же об это говорил

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

....

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


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

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


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

Спасибо за помощь, надо почитать про сериализацию, потомучто я это слово никак не могу осознать..

Автор: 1stain 24.11.2007, 00:04
Мурлыкатам_, если это "не парицца", то что оно тогда по-твоему?

Автор: Мурлыкатам_ 25.11.2007, 19:14
Цитата(1stain @  24.11.2007,  00:04 Найти цитируемый пост)
Мурлыкатам_, если это "не парицца", то что оно тогда по-твоему?


В смысле?

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

Автор: Мурлыкатам_ 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);
            
        }


Как я понял вызывающая сторона должна инициализировать все поля структуры?

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