Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2010, 17:28   #1
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию Сериализация в одной программе и десериализация в другой

Всем привет! Такая проблема появилась, мне нужно сериализовать класс, отправить его на сервер, потом другая программа скачивает его и десериализует. Всё уже написано, но вот десериализовываться не хочет программа. Написал 2 отдельных тестовых проекта, там та же беда, вылетает исключение, что не находит такой то namespace. Незнаю есть ли смысл выкладывать тут код? Просто там ничего особого нету, сериализую класс, а вдругой программе десериализую. Может кто сталкивался с такими проблемами? НУ в принципе может этот код будет о чём то говорить:
Код:
        private void button2_Click(object sender, EventArgs e)
        {
            TestSerialize testSer = new TestSerialize();
            testSer.ddd = this.richTextBox1.Text;
            TestSerialize.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\file.TT", testSer);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            TestSerialize test = TestSerialize.Load(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\file.TT");
            this.richTextBox1.Text = test.ddd;
        }
Код:
namespace TTT
{
    [Serializable]
    class TestSerialize
    {
        public String ddd = "llllllllllllllllllllllllllllllllllllllllllllffasfsfasfaifiasegjsuiurhbgsuuygnyugh";

        public static void Save(String FilePath, TestSerialize test)
        {
            IFormatter binaryFormatter = new BinaryFormatter();
            Stream stream = new FileStream(FilePath,
                FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
            binaryFormatter.Serialize(stream, test);
            stream.Close();
        }

        public static TestSerialize Load(String FilePath)
        {
            IFormatter binaryFormatter = new BinaryFormatter();
            Stream stream = new FileStream(FilePath,
                FileMode.Open, FileAccess.Read, FileShare.None);
            TestSerialize test = (TestSerialize)binaryFormatter.Deserialize(stream);
            stream.Close();
            return test;
        }  
    }

}
В другой программе копия класса TestSerialize, тот же namespace. Если надо, могу 2 проекта выложить.
Casper-SC вне форума Ответить с цитированием
Старый 29.05.2010, 20:00   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

"Unable to find assembly..." ?
Для десериализации требуется та-же сборка, в которой описан сериализуемый класс. (информация о сборке хранится в сохраненных данных - <test1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
Т.е. нужно класс сделать отдельной сборкой и поместить ее в оба конца.

В принципе, пока сборка не подписана и если версия не будет меняться (например в тестовом приложении) достаточно просто сделать оба приложения с одинаковыми именами и все нормально работает.
alexBlack вне форума Ответить с цитированием
Старый 29.05.2010, 20:14   #3
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

А обойти это как-то можно? Мне нужно для разных приложений, и версия будет меняться. Сейчас пробую с XML сериализацией, пока что проблемы с Dictionary, пишу ему замену в виде обычного класса
Casper-SC вне форума Ответить с цитированием
Старый 29.05.2010, 23:32   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Все равно у Вас две копии одного класса. Не проще ли вынести его в отдельную сборку и подключить к двум приложениям.

С SoapFormatter та-же проблема. Разве что в xml подправить имя сборки проще. А вообще механизм уже реализован в NET.Remoting.
alexBlack вне форума Ответить с цитированием
Старый 30.05.2010, 01:34   #5
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Возможно и проще, только я как то сделал dll, а подключить её не смог. Про DllImport я в курсе, просто видимо не так делал.

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

=================================== ===================

Всё разобрался! Сделал dll отдельную и подключил к проектам обоим, вроде работает.

Млин, прикольно, впервые такое написал, теперь моя программа почти научилась получать новости (обращения к пользователям, обновления, изменения в обновлениях, другие мои программы (как реклама) и т.д.) Почти потому, что осталось написать хранение на компьютере пользователя, удаление, чтобы не качала одни и те же новости.

Последний раз редактировалось Casper-SC; 30.05.2010 в 02:39.
Casper-SC вне форума Ответить с цитированием
Старый 30.05.2010, 20:31   #6
Casper-SC
Форумчанин
 
Регистрация: 04.07.2007
Сообщений: 549
По умолчанию

Сегодня покопал в сторону хранения данных на компьютере, вот нашёл 2 варианта, 1-ый это хранение в локальной базе данных, 2-ой в xml файлах (не сериализация). Вот для передачи тех же новостей я думаю подойдут xml файлы, мне нужно, чтобы не было зависимости от версии программы, а то с этими версиями проблем появляется море. Вот такой способ (метод пока просто примерный):
Код:
        private void CreateXMLDocument(string filepath)
        {
            XmlTextWriter xtw = new XmlTextWriter(filepath, Encoding.UTF8);
            xtw.WriteStartDocument();
            xtw.WriteStartElement("ArhiveNews");

            xtw.WriteEndDocument();
            xtw.Close();

            XmlDocument xmlDoc = new XmlDocument();
            FileStream fileStream = new FileStream(filepath, FileMode.Open);
            xmlDoc.Load(fileStream);

            XmlElement news = xmlDoc.CreateElement("News");
            news.SetAttribute("id", "1");

            // Создаем 2 поля   
            XmlElement privet = xmlDoc.CreateElement("Privet");
            XmlElement prodolzh = xmlDoc.CreateElement("Prodolzhenie");

            // Создаем 2 записи  
            XmlText tPrivet = xmlDoc.CreateTextNode("Привет");
            XmlText tProdolzh = xmlDoc.CreateTextNode("Продолжение текста");

            privet.AppendChild(tPrivet); // Забиваем значение  в поле    
            prodolzh.AppendChild(tProdolzh); // Забиваем значение в полe  

            // Забиваем поля privet и prodolzh в запись news   
            news.AppendChild(privet);
            news.AppendChild(prodolzh);
            // Забиваем запись в документ   
            xmlDoc.DocumentElement.AppendChild(news);

            fileStream.Close();         // Закрываем поток   
            xmlDoc.Save(filepath); // Сохраняем файл  
        }
Кто нибудь знает в будущем не будет проблем с версиями? Реально нет времени всё пробовать, я не только этим занят, может кто точно знает?

========================

В общем вопрос глуповатый, похоже версия роли не играет, сейчас сидел разбирался, что к чему.

Последний раз редактировалось Casper-SC; 30.05.2010 в 22:55.
Casper-SC вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение одной таблицы из другой Ольга Ларина Microsoft Office Excel 8 08.02.2010 19:10
Постоянный фокус на одной программе regman Общие вопросы Delphi 20 10.08.2009 11:07
сериализация и десериализация radiantor Работа с сетью в Delphi 7 02.08.2008 00:27
ListView в другой программе Domoffou Win Api 2 22.01.2008 08:07
Сортировка одной БД по значениям другой Кот из Лета БД в Delphi 4 28.12.2007 13:35