Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация 
:(
    Опции темы
STRELOKBMSTU
Дата 25.12.2009, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 11.8.2007
Где: Russia.MR.Moscow( );

Репутация: нет
Всего: нет



Есть собственный класс:

Код

    [Serializable]
    public sealed class MessageObject
    {
            private Type _messageType;
            private IPEndPoint _ip;


            public enum Type
            { 
              Register,
              Unregister,
              InputMessage
            }
                       
            public Type MessageType
            {
                get { return _messageType; }
                set { _messageType = value; }
            }

            public IPEndPoint IP
            {
                get { return _ip; }
                set { _ip = value; }
            }

        
            public MessageObject()
            { }
        }


при попытке его сериализации XmlSerializer'ом вылетает Exception:

Код

There was an error reflecting type 'WindowsFormsApplication3.MessageObject'.

"Cannot serialize member 'WindowsFormsApplication3.MessageObject.IP' of type 'System.Net.IPEndPoint', see inner exception for more details."}


{"System.Net.IPEndPoint cannot be serialized because it does not have a parameterless constructor."}



Может каким-нибудь атрибутом пометить эндпоинт или еще что-то сделать, чтоб его засериализовать???

PM MAIL ICQ Skype   Вверх
tol05
Дата 25.12.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



можно непосредственно реализовать интерфейс ISerializable и в нем вручную серилизовывать\десерилизовывать это поле

второй вариант - задать тип свойства строка, наример, а в get\set преобразовывать сроку в IPEndPoint и обратно


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
STRELOKBMSTU
Дата 25.12.2009, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 11.8.2007
Где: Russia.MR.Moscow( );

Репутация: нет
Всего: нет



Погодь, что-то не до конца понял... Второй метод вроде попроще, но у свойства получается должен быть всегда тип string??? Можно поподробнее, если получится, с кодом? smile 
PM MAIL ICQ Skype   Вверх
tol05
Дата 25.12.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



даже кода не нужно. Вам со свойством 
Код

  public IPEndPoint IP
            {
                get { return _ip; }
                set { _ip = value; }
            }
и работать нужно, и серилизовывать его?
Ну так сделайте два свойства. Одно с типом string - для серилизации\десерилизации, а второе (с аттрибутом XmlIgnore) - для работы. 
оба свойтсва будут работать с одним и тем же полем 
Код

 private IPEndPoint _ip;

...
Код

public string serilizedIP
            {
                get { //делаем из поля _ip сроку }
                set { //делаем из строки значение для _ip }
            }
[XmlIgnore]
public IPEndPoint IP
            {
                get { return _ip; }
                set { _ip = value; }
            }


Это сообщение отредактировал(а) tol05 - 25.12.2009, 15:20


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
STRELOKBMSTU
Дата 25.12.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 11.8.2007
Где: Russia.MR.Moscow( );

Репутация: нет
Всего: нет



Вот, добрались до атрибутов, с утра по ним инфу копаю, у меня нету [XmlIgnore]...  Как его подключить, в каком он namespace?
PM MAIL ICQ Skype   Вверх
tol05
Дата 25.12.2009, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



System.Xml.Serialization
странно. как Вы с XmlSerializer работаете тогда? он в том же намеспейсе находится.


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
STRELOKBMSTU
Дата 25.12.2009, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 11.8.2007
Где: Russia.MR.Moscow( );

Репутация: нет
Всего: нет



Пасиб, в классе не использовал этот наймспейс.

А private поля тоже сериализуются? Сейчас у меня код выглядит так, но значение не передается все равно...


Код

[Serializable]
    public sealed class MessageObject
    {
            private Type _messageType;
            private IPAddress _ip;
            private int _port;
            public enum Type
            { 
              Register,
              Unregister,
              InputMessage
            }
                       
            public Type MessageType
            {
                get { return _messageType; }
                set { _messageType = value; }
            }

        [XmlIgnore]
        public IPEndPoint IP
        {
            get
            {
                return new IPEndPoint(_ip, _port);
            }
            set
            {
                _ip = value.Address;
                _port = value.Port;
            }
        }
        
            public MessageObject()
            { }
        }


Это сообщение отредактировал(а) STRELOKBMSTU - 25.12.2009, 17:09
PM MAIL ICQ Skype   Вверх
tol05
Дата 25.12.2009, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Серилизатор XML серилизует только public члены класса, и только те, которые не помечены аттрибутом  [XmlIgnore]
Я не вижу второго свойства, о котором мы говорили. Где оно?

вот код, короче
Код

public sealed class MessageObject
    {
        private Type _messageType;
        private IPAddress _ip;
        private int _port;
        
        public enum Type
        {
            Register,
            Unregister,
            InputMessage
        }

        public Type MessageType
        {
            get { return _messageType; }
            set { _messageType = value; }
        }

        [XmlIgnore]
        public IPEndPoint IP
        {
            get
            {
                return new IPEndPoint(_ip, _port);
            }
            set
            {
                _ip = value.Address;
                _port = value.Port;
            }
        }

        [XmlElement(ElementName = "IP")]
        public string SerializableIP
        {
            get
            {
                return string.Format("ip={0}_port={1}", _ip, _port);
            }
            set
            {
                //добавить проверки на кол-во элементов массива и try-catch на парсинг
                
                string[] inputValues = value.Split('_');
                _ip = IPAddress.Parse(inputValues[0]);
                _port = Int32.Parse(inputValues[1]);
            }
        }

        public MessageObject(){ }
    }


Это сообщение отредактировал(а) tol05 - 25.12.2009, 18:00


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
STRELOKBMSTU
Дата 25.12.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 11.8.2007
Где: Russia.MR.Moscow( );

Репутация: нет
Всего: нет



В интернете почитал вроде как для сериализации EndPoint используется тип SocketAddress, но с ним те же косяки были... пробовал так:

Код

[Serializable]
    public sealed class MessageObject
    {
        private Type _messageType;
        private SocketAddress _ip;

        public enum Type
        {
            Register,
            Unregister,
            InputMessage
        }

        public Type MessageType
        {
            get { return _messageType; }
            set { _messageType = value; }
        }

        public SocketAddress IP
        {
            get { return _ip; }
            set { _ip = value;}
        }


        [XmlIgnore]
        public IPEndPoint IPEndPoint
        {
            get 
            {
              IPEndPoint endpoint = new IPEndPoint(0, 0);
              return (IPEndPoint)endpoint.Create(_ip);
            }
            set { _ip = value.Serialize(); }
        }


        public MessageObject()
        { }
    }


но с ним те же проблемы были, сейчас попробую ваш метод, надеюсь поможет... smile 
PM MAIL ICQ Skype   Вверх
Heinzz
Дата 25.12.2009, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 12.12.2008
Где: .net

Репутация: 5
Всего: 9



Цитата(STRELOKBMSTU @  25.12.2009,  17:08 Найти цитируемый пост)
А private поля тоже сериализуются

нет


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0543 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.