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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2016, 10:59   #1
Владимрл
Пользователь
 
Регистрация: 04.04.2015
Сообщений: 23
По умолчанию Десериализация объекта

Здравствуйте ! Подскажите пожалуйста, почему программа не может найти файл Demon.bin по пути C:\\qqq\\www\\eee\\Demon.bin ?


// Листинг 11.12. Десериализация объекта

Код:
using System; 
using System.IO;
using System.Runtime.Serialization.Formatters.Binary; 
namespace Pavlovs_270
{
        abstract class Spirit
    {
        public abstract void Passport();
    }

    
    class Monster : Spirit
    {
        public Monster(int health, int ammo, string name)
        {
            this.health = health;
            this.ammo = ammo;
            this.name = name;
        }

        override public void Passport()
        {
            Console.WriteLine("Monster {0}  \t health = {1}  ammo  =  {2}",
                                name, health, ammo);
        }

        string name;
        int health, ammo;
    }

        class Demo          
    {
        
        public int a = 1;
         
        public double b;
        
        public Monster X, Y;
    }
   
   class Class1
   {
      static void Main()
      {
         
         FileStream f = new FileStream("C:\\qqq\\www\\eee\\Demon.bin", FileMode.Open);
 
         BinaryFormatter bf = new BinaryFormatter();

         Demo d = (Demo)bf.Deserialize( f ); 	//  восстановление  объекта

         d.X.Passport()  ; 	  d.Y.Passport();
         Console.WriteLine( d.a );  Console.WriteLine(  d.b  );

         f.Close();

         Console.ReadKey();
      }
   }
 }
______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.

Последний раз редактировалось Alex11223; 06.05.2016 в 11:05.
Владимрл вне форума Ответить с цитированием
Старый 06.05.2016, 11:05   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну видимо его там нет раз не может.

А проблема точно в этом? Что именно выдает?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.05.2016, 12:44   #3
Владимрл
Пользователь
 
Регистрация: 04.04.2015
Сообщений: 23
По умолчанию

Если дописать в программе :


Код:
catch (Exception e) 
           { 
               Console.WriteLine("Error:  " + e.Message); 
               Console.ReadKey(); 
           }

Консоль выдает Error: Не удалось найти сборку “Pavlovs_268, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null “
Владимрл вне форума Ответить с цитированием
Старый 07.05.2016, 13:28   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну так файл сериализованный старой версией программы (с другими именами неймспейсов и т.п.) нельзя десериализовать (или может быть надо что-то указать в опциях BinaryFormatter)

Но вообще такая бинарная сериализация не лучший вариант для хранения. Проще текстовые форматы для этого. XML (XmlSerializer), JSON (Json.Net, ...).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 07.05.2016 в 13:30.
Alex11223 вне форума Ответить с цитированием
Старый 07.05.2016, 15:15   #5
Владимрл
Пользователь
 
Регистрация: 04.04.2015
Сообщений: 23
По умолчанию

Спасибо !
Тут ситуация вот какого рода.

Этот текст программы из книги Павловская Т. А. “ С#. Программирование на языке высокого уровня “ стр.270 . Я дописал код, где стоит многоточие. Но консоль выдает Error: Не удалось найти сборку “Pavlovs_268, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null “
Можно ли в месте, где стоит многоточие дописать код ? ( Не знаю, что Павловская Т.А. имела ввиду под многоточием )

Код:
//  Листинг 11.12. Десериализация объекта
 
using System; 
using System.IO;
using System.Runtime.Serialization.Formatters.Binary; 
namespace Pavlovs_270
{
      …………………………  ( многоточие )

      static void Main()
      {
         
         FileStream f = new FileStream("C:\\qqq\\www\\eee\\Demon.bin", FileMode.Open);
 
         BinaryFormatter bf = new BinaryFormatter();
 
         Demo d = (Demo)bf.Deserialize( f );    //  восстановление  объекта
 
         d.X.Passport()  ;    d.Y.Passport();
         Console.WriteLine( d.a );  Console.WriteLine(  d.b  );
 
         f.Close();
 
         Console.ReadKey();
      }
   }
 }


Это предыдущая программа, она работает все с ней нормально :



Код:
// Листинг  11.11.  Сериализация  объекта
using System; 
using System.IO;
using System.Runtime.Serialization.Formatters.Binary; 
namespace Pavlovs_268 
{
   [Serializable]   
   abstract class Spirit
   {
      public abstract void Passport();
   }

   [Serializable] 
   class Monster : Spirit 

   {
      public Monster( int health, int ammo, string name )
      {   
         this.health = health; 
         this.ammo = ammo;
         this.name = name;
      }

      override public void Passport()
      {
         Console.WriteLine( "Monster {0}  \t health = {1}  ammo  =  {2}", 
                             name, health, ammo );
      }

      string name; 
      int health, ammo;
   }

    [Serializable] 
   class Demo            
   {

      public int a = 1;      

      [NonSerialized] 
      public double b;
      public Monster X,Y;
   }

   class Class1 
   {  static void Main() 
      {
         Demo d = new Demo();
         d.X = new Monster( 100, 80, "Вася" );
         d.Y = new Monster( 120, 50, "Петя" );
         d.a = 200;
         d.b = 400;

         d.X.Passport();      
         d.Y.Passport ();

         Console.WriteLine();
         Console.WriteLine();

         Console.WriteLine( d.a );  
         Console.WriteLine( d.b );
         
         FileStream f = new FileStream("C:\\qqq\\www\\eee\\Demon.bin",         FileMode.Create); 
         BinaryFormatter bf = new BinaryFormatter();

         bf.Serialize( f, d ); 	//  сохранение объекта d в потоке f

         f.Close();

         Console.ReadKey();
      }
   }
}

Или многоточие Павловская Т.А. поставила от фонаря и ничего на этом месте не допишешь ???
Владимрл вне форума Ответить с цитированием
Старый 07.05.2016, 15:21   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Сериализовывать и десериализовывать таким способом можно только класс из одной и той же программы/сборки.
Наверно в многоточии была и сериализация. Или например сериализуемый класс вынесен в отдельную библиотеку.

Но вообще BinaryFormatter плохой вариант для хранения. Только для временного, транспортировки (по сети) и т.п.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 07.05.2016, 15:27   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

рядом с вашим 270, должна быть сборка 268.
иначе не десериализует.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
десериализация Python unbanned Python 0 05.06.2013 15:18
Десериализация alexa2352 Microsoft Office Excel 2 22.06.2012 18:16
Десериализация Selestis Общие вопросы C/C++ 6 02.02.2011 16:02
C# и Xml десериализация DeCo Общие вопросы .NET 2 17.03.2010 00:55
сериализация и десериализация radiantor Работа с сетью в Delphi 7 02.08.2008 00:27