Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 1
Регистрация: 19.02.2012
Сообщений: 24

Невозможная десериализация другим приложением

04.04.2014, 22:28. Показов 2090. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер!
Как то я начал сохранять структуры в файл с помощью сериализации и все было хорошо пока я не захотел считывать данные с того же файла другим приложением, после чего мне выдало ошибку:


Необработанное исключение типа "System.Runtime.Serialization.Serializat ionException" в mscorlib.dll
Дополнительные сведения: Не удалось найти сборку "TCP Client 1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null".


Почитал, почитал и понял, что при сериализации данные сохраняются с так называемыми "строгими именами".

Так вот! Подскажите как сделать так, чтобы я мог читать информацию любым приложением при сериализации без "строгих имен"?
Заранее спасибо!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.04.2014, 22:28
Ответы с готовыми решениями:

Бинарный файл, созданный одним приложением, не читается другим приложением
Добрый день. Проблема: Первое приложение создает List<MyClass> и сериализует в бинарный файл. Другое приложение, использующее MyClass, этот...

Значение, возвращаемое приложением должно быть "увидено" другим приложением
Всем привет. Подскажите пожалуйста, как после определённого события, к примеру, при нажатии на кнопку, приложение возвращало-бы...

Взаимодействие с другим приложением
Всегда было интересно, возможно ли управлять элементами сторонних окон? Например в стандартном приложении calc.exe, сложить 1+1 и...

9
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
04.04.2014, 22:31
MarkTwis, мне пришлось в тот день написать библиотеку, которая эти занимается.
И эту библиотеку подключать к разным моим приложениям. Библа одна, проги - разные
0
1 / 1 / 1
Регистрация: 19.02.2012
Сообщений: 24
04.04.2014, 22:41  [ТС]
Я не настолько крут в программировании!
И если другого варианта нету, кроме создания библиотеки, то может мне надо использовать другие функции для сохранения структур!
Подскажи направление!
0
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
04.04.2014, 22:47
Цитата Сообщение от MarkTwis Посмотреть сообщение
Я не настолько крут в программировании!
Вы это напишете за чашкой кофе. Что Вас напугало, слово "библиотека"?

Создаете проект "Библиотека классов" и сериализацию пишете не в своем приложении, а в библе.
Подключаете ее через Проект - добавить ссылку.
Метод, который сериализует, должен быть виден извне
0
1 / 1 / 1
Регистрация: 19.02.2012
Сообщений: 24
04.04.2014, 22:52  [ТС]
Вы это напишете за чашкой кофе. Что Вас напугало, слово "библиотека"?
Я видимо сначала не так понял!
То есть, если я буду использовать библиотеку, то получиться, что файл с данными будет использовать одно приложение, я прав?
0
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
04.04.2014, 23:27
MarkTwis, нет, это библиотеку Вы можете подключать к любым своим приложениям.
Допустим, у Вас есть программа А и программа Б
Программа А пишет структуры в файл, сериализуя их.
В программе Б такой же алгоритм чтения файла, как и в А. Но Вы получите ошибку, мол, какой прогой записывал, той и считывай (у Вас как раз такая ошибка, как я понял)
Пишем библу, цепляем к обоим прогам, и через нее обращаемся к файлу.

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

Сейчас я попробую накидать пример, и проверить, не наврал ли я тут с короб

Добавлено через 29 минут
Итак. Пример.

Создаем Библиотеку классов.
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Public Class StructToFileClass
    Sub StructToFile(ByVal FileName As String, ByVal O As Object)
        Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        Using stream As IO.Stream = IO.File.Create(FileName)
            formatter.Serialize(stream, O)
        End Using
    End Sub
 
    Function FileToStruct(ByVal FileName As String) As Object
        Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        Using stream As IO.Stream = IO.File.Open(FileName, IO.FileMode.Open)
            Return formatter.Deserialize(stream)
        End Using
    End Function
    <System.Serializable()> Class Test
        Public S As String
        Public I As Integer
    End Class
End Class



Прога А. Подключаем скомпилированную библу и пишем

VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Imports Serial.StructToFileClass
Public Class Form1
 
    Dim S As New Serial.StructToFileClass
    Dim L As New List(Of Test)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 
        For I As Integer = 0 To 10
            Dim Tmp As New Test With {.I = I, .S = Guid.NewGuid.ToString}
            L.Add(Tmp)
        Next
        S.StructToFile("C:\Ex.bin", L)
    End Sub
End Class



Прога В. Подключаем скомпилированную библу и пишем

VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
Imports Serial.StructToFileClass
Public Class Form1
 
    Dim S As New Serial.StructToFileClass
    Dim L As New List(Of Test)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        L = S.FileToStruct("C:\Ex.bin")
        MsgBox(L(2).S)
    End Sub
End Class



У Вас, разумеется, другой класс или структура, у меня в качестве примера класс Test с двумя полями

Результат: Прога А сериализует созданный массив классов
Прога В успешно его читает
2
1 / 1 / 1
Регистрация: 19.02.2012
Сообщений: 24
04.04.2014, 23:40  [ТС]
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Так то я уже набрасал тоже кое что:

Библиотека (кстати, моя первая!)
VB.NET Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Public Class Class1
    <System.Serializable()> Structure PLCData_Basic
        Dim NumPLC As Integer
        Dim VarinPLC As Integer
        Dim Var() As Integer
        Dim Status As Integer
        Dim IsActualData As Boolean
        Dim NeedSetInPLC As Boolean
    End Structure
 
 
    Public PLCData(20) As PLCData_Basic
 
    Public Function SaveInFile(Path As String) As Integer
        Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        Using stream As IO.Stream = IO.File.Create(Path)
            formatter.Serialize(stream, PLCData)
        End Using
        Return 1
    End Function
 
    Public Function ReadFromFile(Path As String) As Integer
        Dim formatter As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
        Using stream As IO.Stream = IO.File.Open(Path, IO.FileMode.Open)
            PLCData = formatter.Deserialize(stream)
        End Using
        Return 1
    End Function
End Class
Приложение №1
VB.NET Скопировано
1
2
3
    Dim Serialz As New SerializLib1.Class1
        Serialz.PLCData = PLCData
        Serialz.SaveInFile(MyPath)
Вот, только при попытке присвоить массив приложения массиву в библиотеке выдает ошибку: Невозможно преобразовать значения этого типа в такой то, хотя они одинаковы!
Почему так?

Добавлено через 3 минуты
Или вместо структуры надо класс? как у вас в примере.
0
Почетный модератор
 Аватар для Памирыч
23246 / 9158 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
04.04.2014, 23:43
Не думаю, что разница принципиальна, структуры тоже сериализуются.
Цитата Сообщение от MarkTwis Посмотреть сообщение
Невозможно преобразовать значения этого типа в такой то
Может, дело не в сериализации, а Вы что-то там неправильно заполнили в структуре?
Вот Вы в приложении 1 создали экземпляр Вашего класса, и присвоили PLCData какие то данные (PLCData)
А что в них - проверьте, полей много, вдруг что-то напутали
0
1 / 1 / 1
Регистрация: 19.02.2012
Сообщений: 24
04.04.2014, 23:56  [ТС]
Все, нашел ошибку! PLCData надо было объявлять как SerializLib.Class1.PLCData_basic!

Добавлено через 10 минут
Проверил чтение с разных приложений - ВСЕ ЧЕТКО!
СПАСИБО ПАМИРЫЧ, ВЫРУЧИЛ!
0
05.04.2014, 00:03

Не по теме:

MarkTwis, а говорили

Цитата Сообщение от MarkTwis Посмотреть сообщение
Я не настолько крут в программировании!
:D

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2014, 00:03
Помогаю со студенческими работами здесь

Управление другим приложением!
Есть приложение (простенькая старенькая любимая игра без исходников). НЕ ПУТАТЬ С БОТОВОДСТВОМ! Задача передать в неё эмуляцию...

Связь с другим приложением
Здравствуйте! Подскажите, пожалуйста, по следующему вопросу: Есть обычное приложение на C#. Через класс Process инициирую запуск...

Управление другим приложением
Допустим, мы имеем простое оконное приложение А, которое имеет падающее меню со списком цифр от 1 до 9. Можно ли создать такое отдельное от...

управление другим приложением
Есть flash приложение в окне браузера (допустим webBrowser на форме). Так вот... програмно нажать кнопку в этом приложении?

Управление другим приложением
Добрый день. Не могу никак разобраться. У программы которой хочу управлять знаю все с помощью проги spy++: дескриптор, заголовок,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
Агрегаты и сущности в DDD микросервисах
Javaican 10.04.2025
Разработка современных программных систем часто приводит на распутье: монолит или микросервисы? Даже при выборе микросервисной архитектуры многие команды сталкиваются с проблемой правильного. . .
Многопоточность в C#: Task и параллельное программирование
UnmanagedCoder 10.04.2025
Современные процессоры уже давно перестали наращивать тактовую частоту в пользу увеличения количества ядер. Это создало интересную ситуацию: разработчики, привыкшие к последовательному. . .
Линейное решение нелинейной задачи будет иметь приблизительный результат вычисления для метода обработки данных из double buffering.
Hrethgir 10.04.2025
Вообще изначально я пренебрёг квадратурой числа, но потом понял, что для вычисления приблизительного значения - сгодится, формулу можно будет корректировать по ходу. Это потому что прямое соотношение. . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
Vue SFC компонент на PHP с Fusion
Jason-Webb 09.04.2025
PHP на сервере и JavaScript на клиенте — классическое сочетание, которое, несмотря на свою эффективность, создает определенный когнитивный диссонанс при разработке. В этом контексте появляются. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер