Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3

Создание копии объекта через сериализацию

03.12.2015, 15:33. Показов 3724. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Реализую так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static T CopyFromSerialize<T>(T SerializableObject) where T : new()
        {
            try
            {
                MemoryStream stream = new MemoryStream();
 
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, SerializableObject);
                return (T)formatter.Deserialize(stream);
            }
            catch (Exception ex)
            {
                MessageSvc.ShowError(ex.Message);
                return new T();
            }
        }
Но когда доходит до десериализации выскакивает ошибка "конец потока обнаружен до завершения разбора".
Что я не так делаю?
Спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.12.2015, 15:33
Ответы с готовыми решениями:

Создание полной копии объекта с рефлексией
Не знаю, будет ли кому-то интересно, все описал тут: https://www.cyberforum.ru/blogs/188200/blog1518.html

Создание полной копии (deep copy) объекта
Всем привет, понадобилось в проекте создать полную копию объекта, для чего воспользовался двоичной сериализацией: public static...

Создание копии объекта используя объявление через указатель
Здравствуйте. Имеется такой код: #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class medicament { private: ...

10
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
03.12.2015, 15:36
Лучший ответ Сообщение было отмечено OwenGlendower как решение

Решение

Serg34, после строчки с сериализацией
C#
1
stream.Seek(0, SeekOrigin.Begin);
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
03.12.2015, 19:51
Serg34, я вроде в блоге писал. Конечно, там решение можно доводить до ума и улучшать, но посыл верный:
https://www.cyberforum.ru/blog... g1518.html
1
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
04.12.2015, 10:30  [ТС]
Cupko, Спасибо. То, что было нужно!
Psilon, интересная статья. Тоже думал об этом, а тут готовое(или почти)) решение. Спасибо!
Только не совсем понял, копируются ли у Вас вложенные экземпляры классов?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
04.12.2015, 11:14
Цитата Сообщение от Serg34 Посмотреть сообщение
C#
1
2
3
4
5
catch (Exception ex)
{
   //....
   return new T();
}
Вот этого не надо.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.12.2015, 11:47
Serg34, ну должны копироваться
Правда там есть нюанс в интерфейсе ICloneable. То есть например массив классов фактически скопирует ссылки на старые объекты, а не сами объекты. Если это ненужное поведение (то есть нужна "глубокая" копия), то нужно эту ветку убрать.

Ну и нужно понимать, что тот код я писал больше 2 лет назад, за это время многое для меня поменялось
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
04.12.2015, 14:12  [ТС]
Storm23, согласен. Причем без блока try-catch эффект тот же -выводится на экран тоже сообщение (только без заголовка) и никаких исключений. Первый раз такое встречаю

Добавлено через 1 час 2 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
должны копироваться
Не готов так сходу что-либо утверждать, но по моему "глубокая" копия в этом случае (если объект не сериализуемый) возможна только при помощи рекурсии, причем надо учитывать, что свойство может быть коллекцией, а коллекции аля Dictionary, - тоже нужно подумать как копировать и еще кучу всего надо учитывать. А чего еще придумают в будущем...
Вобщем, думаю для универсального решения проще все-таки пользоваться сериализацией.

Добавлено через 3 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
код я писал больше 2 лет назад, за это время многое для меня поменялось
ок, я Вас не критикую, просто кодом интересуюсь
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
04.12.2015, 20:13
Serg34, так там и есть рекурсия

Цитата Сообщение от Serg34 Посмотреть сообщение
ок, я Вас не критикую, просто кодом интересуюсь
а это просто дисклеймер
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
06.12.2015, 22:10  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
так там и есть рекурсия
Да, сразу не заметил (думал Clone - это из ICloneable)

А вот дисклеймер не зря давали:
1) код не дружит с null, но это решается просто.
2)А вот наследник словаря сбил код с толку посерьезнее: проверку на сериализируемость (ох как по-русски то звучит) он прошел, но как дошло до дела выдал сообщение, что сериализацию то он не поддерживает
(см. вложение)
Вложения
Тип файла: rar CheckClone.rar (56.4 Кб, 2 просмотров)
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
06.12.2015, 22:49
Psilon, Serg34,
Цитата Сообщение от Serg34 Посмотреть сообщение
А вот наследник словаря сбил код с толку посерьезнее: проверку на сериализируемость (ох как по-русски то звучит) он прошел, но как дошло до дела выдал сообщение, что сериализацию то он не поддерживает
В классе CloneSvc несколько ошибок:
1) BinaryFormatter требует атрибут Serializable. Даже если объект реализует ISerializable, все равно требуется атрибут. Поэтому для сериализации объектов, которые реализуют ISerializable, но не помечены как [Serializable] нужно сделать обертку с атрибутом, которую уже сериализовать.
2) В методе Clone: buffer = stream.GetBuffer(); => buffer = stream.ToArray();

Цитата Сообщение от Serg34 Посмотреть сообщение
А вот наследник словаря сбил код с толку
Если вы наследуете класс, которые реализует ISerializable (а Dictionary - именно такой), вам обязательно нужно создать специальный конструктор для ISerializable (это результат того, что в C# конструкторы не наследуются). В противном случае объект не сможет десериализоваться. Т.о. ваш класс MyDictionary должен выглядеть так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    [Serializable]
    public class MyDictionary : Dictionary<int, int>
    {
        public HasDictionary Object { get; set; }
 
        /// <summary>
        /// Default constructor
        /// </summary>
        public MyDictionary()
        {
        }
 
        /// <summary>
        /// ISerializable constructor
        /// </summary>
        protected MyDictionary(SerializationInfo info, StreamingContext context):base(info, context)
        {
        }
    }
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
06.12.2015, 23:41
Storm23, да там вообще много нужно менять (начать с того, что вместо 2 memorystream'ов нужно просто оффсет в 0 выставить при десериализации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.12.2015, 23:41
Помогаю со студенческими работами здесь

Сохранение данных через бинарную сериализацию
public class DataModel { public bool Active { get; set; } public int ElementType { get; set; } public...

Создание объекта через корутину
Помогите вопрос решить такой: Есть корутина там создаются объекты, как то можно сделать так чтоб предмет не создавался там где только что...

Ссылки и копии объекта
Я не могу до конца раза браться когда мы получаем ссылку на объект а когда его копию. Может я немного не правильно выражаюсь потому...

Создание объекта через IIS выдаёт ошибку
Создал asp страницу, всьо нормально работает но только я пытаюсь выполнить её ч-з IIS выдаёт ошибку на строчке set...

Создание объекта через xml разметку. NullPointerExeption
Кажется у меня пробел в основах, я думал прописывая вью через разметку, при сборке создается экземпляр класса, и стоит лишь найти вьюшку по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru