powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблема с десериализацией
5 сообщений из 5, страница 1 из 1
Проблема с десериализацией
    #38352220
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Написал простой класс настроек:
Код
Код: c#
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;

namespace HostMgd.Samples
{

    /// <summary>
    /// Settings info
    /// </summary>
    [Serializable]
    public class Preferences
    {

        public Preferences()
        {
            Point = true;
            Tab = true;
            Space = true;
            Semicolon = true;
            CultureName = "";
            Filter = "txt files (*.txt)|*.txt|csv files (*.csv)|*.csv";
        }

        Boolean point, comma, space, tab, semicolon;
        String cultureName, filter;

        public Boolean Point
        {
            get { return point; }
            set { point = value; comma = !value; }
        }

        public Boolean Comma
        {
            get { return comma; }
            set { comma = value; point = !value; }
        }

        public Boolean Space
        {
            get { return space; }
            set { space = value; }
        }

        public Boolean Tab
        {
            get { return tab; }
            set { tab = value; }
        }

        public Boolean Semicolon
        {
            get { return semicolon; }
            set { semicolon = value; }
        }

        public String CultureName
        {
            get { return cultureName; }
            set { cultureName = value; }
        }

        public String Filter
        {
            get { return filter; }
            set { filter = value; }
        }

        static readonly String fileName = Path.Combine(Path.GetDirectoryName(
            typeof(Preferences).Assembly.Location), "settings.xml");

        public void Save()
        {
            Stream stream = File.Open(fileName, FileMode.Create);
            SoapFormatter formatter = new SoapFormatter();
            formatter.Serialize(stream, this);
            stream.Close();
        }

        public Char[] GetSpaces()
        {
            List<Char> spaces = new List<Char>();
            if (Tab)
                spaces.Add('\t');
            if (Space)
                spaces.Add(' ');
            if (Semicolon)
                spaces.Add(';');
            return spaces.ToArray();
        }

        public static Preferences Open()
        {
            if (!File.Exists(fileName))
                return new Preferences();

            Stream stream = File.Open(fileName, FileMode.Open);
            SoapFormatter formatter = new SoapFormatter();
            Preferences result = null;
            result = (Preferences)formatter.Deserialize(stream);
            stream.Close();
            return result;
        }
    }
}


На работе всё работало успешно (как сериализация, так и десериализация). Правда на работе я компилировал под .net 4.0, а дома компилирую под .net 3.5. Компиляция так же проходит успешно. Однако во время работы получаю проблему: сериализация проходит без ошибок, но десериализацию выполнить не удаётся:
ОшибкаParse Error, no assembly associated with Xml key
a1: http://schemas.microsoft.com/clr/nsassem/HostMgd.Samples/ImportCoords_v1,%2
0Version%3D1.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull Preferences

В чём проблема?

Спасибо.
...
Рейтинг: 0 / 0
Проблема с десериализацией
    #38352289
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum, вроде такая проблема может возникнуть если сборка с сериализуемым типом была подписана, уже после создания файла с сериализованными данными или если нет ссылки на сборку с типом. Второе мы похоже можем исключить т.к. приложение единое, а вот в первом случае просто сотри файл с сериализованными данными и повтори процесс по новой.

P.S. Почему ты используешь именно SOAP, а не XML сериализацию?
...
Рейтинг: 0 / 0
Проблема с десериализацией
    #38352424
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

Я не подписывал сборку. SOAP заюзал, просто потому, что он так же имеет XML формат. :) Переделал сериализацию\десериализацию так:

Код: c#
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.
30.
31.
32.
33.
public void Save()
{
    using (Stream stream = File.Open(fileName, FileMode.Create))
    {
        XmlSerializer ser = new XmlSerializer(this.GetType());
        using (TextWriter writer = new StreamWriter(fileName))
        {
            ser.Serialize(writer, this);
            writer.Flush();
            writer.Close();
        }
        stream.Close();
    }
}

public static Preferences Open()
{
    if (!File.Exists(fileName))
        return new Preferences();

    Preferences result = null;
    using (Stream stream = File.Open(fileName, FileMode.Open))
    {
        XmlSerializer ser = new XmlSerializer(typeof(Preferences));
        using (TextReader reader = new StreamReader(fileName))
        {
            result = (Preferences)ser.Deserialize(reader);
            reader.Close();
        }
        stream.Close();
    }
    return result;
}


Однако в процессе работы программы получаю такое сообщение об ошибке:



Вижу, что создаётся XML файл нулевого размера... Что неправильно в коде сериализации\десериализации?
...
Рейтинг: 0 / 0
Проблема с десериализацией
    #38352492
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, с утра не проснулся.
С утра правил код банальным копипастом, и только сейчас обратил внимание, что у меня TextReader и TextWriter прописаны в блоке Stream. Исправил, заработало:

Код: c#
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.
public void Save()
{
    XmlSerializer ser = new XmlSerializer(this.GetType());
    using (TextWriter writer = new StreamWriter(GetFileName()))
    {
        ser.Serialize(writer, this);
        writer.Flush();
        writer.Close();
    }
}

public static Preferences Open()
{
    if (!File.Exists(GetFileName()))
        return new Preferences();

    Preferences result = null;
    XmlSerializer ser = new XmlSerializer(typeof(Preferences));
    using (TextReader reader = new StreamReader(GetFileName()))
    {
        result = (Preferences)ser.Deserialize(reader);
        reader.Close();
    }
    return result;
}



Однако мне всё же интересно, в чём была проблема при использовании SOAP сериализации (первый пост топика)?
...
Рейтинг: 0 / 0
Проблема с десериализацией
    #38352743
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumОднако мне всё же интересно, в чём была проблема при использовании SOAP сериализации (первый пост топика)?
Непонятно. У меня не получается вопроизвести проблему. Вспоминай чем еще отличаются приложения кроме версии .NET. Может ты менял версию приложения? Разносил код по разным сборкам?

CompositumС утра правил код банальным копипастом, и только сейчас обратил внимание, что у меня TextReader и TextWriter прописаны в блоке Stream. Исправил, заработало:
Проблема не во вложенности, а попытке повторного открытия того же файла. Вместо
Код: sql
1.
2.
3.
Stream stream = File.Open(fileName, FileMode.Create)
...
TextWriter writer = new StreamWriter(fileName)


нужно было написать
Код: sql
1.
2.
3.
Stream stream = File.Open(fileName, FileMode.Create)
...
TextWriter writer = new StreamWriter(stream)



И пара мелких замечаний:
1. В каждом примере в блоке using ты вызываешь Close(). В этом нет никакой необходимости т.к. using это сделает автоматически.
2. Рекомендую переименовать метод Open в Load т.к. название Open предполагает действие по открытию чего-либо с последующим закрытием. Класс Preferеnces в эту схему не укладывается. Есть пары глаголов которые рекомендуется использовать совместно: Open - Close, Save - Load, Insert - Delete, Add - Remove, Show - Hide и т.д. и т.п. Смысл этой рекомендации в упрощении кода т.к. видя метод Add программист может предполагать наличие парного метода Remove.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Проблема с десериализацией
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]