Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 20.02.2012
Сообщений: 28
1

Десериализация работает на одном комьютере и не работает на другом

19.03.2013, 11:45. Просмотров 1250. Ответов 13
Метки нет (Все метки)


Провожу десериализацию из файла - на компе разработки все нормально, на компе пользователя - выходит ошибка что статичные поля класса нельзя сериализовать.
При этом, в десериализуемом классе у меня нет ни одного поля static, и в классах на которые он ссылается - тоже.
Единственное - есть public поле тип которого - перечисление, объявленное в статичном классе. Но на моем компьютере это не приводит к ошибке.
В чем может быть причина?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2013, 11:45
Ответы с готовыми решениями:

Интернет работает очень медленно на одном ПК, на другом работает быстрее.
Такая проблема, интернет очень плохо работает,скорость совсем маленькая (14м) подключаю другой комп...

Отсылка на email работает в одном проекте, и не работает в другом
в одном приложении письмо отправляет без проблем IdSMTP1.Host:='smtp.mail.ru';...

Getimagesize работает на одном и не работает на другом сервере
list($w_i, $h_i, $type) = getimagesize($file_input); Переменная $file_input начинается так:...

Компьютер работает в одном кабинете, а в другом не работает
Итак, есть машина под управлением XP. Всё началось с того, что пару раз зависал вмёртвую....

13
Эксперт .NET
14842 / 11229 / 2947
Регистрация: 17.09.2011
Сообщений: 18,812
19.03.2013, 11:55 2
Гляньте восемнадцатую строчку — ошибка, скорее всего, там.
0
1 / 1 / 0
Регистрация: 20.02.2012
Сообщений: 28
19.03.2013, 16:53  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Гляньте восемнадцатую строчку — ошибка, скорее всего, там.
Я так понимаю что вы намекаете на код? Сегодня до ночи не смогу выложить, да и все равно он слишком объемный - лень будет читать.
Могу и так описать структуру псевдокодом, но не думаю что это поможет, скорее всего не в этом дело, раз у меня работает:

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
public class Manager
{
    public Map map;
    public int n = 0;
    //....//
    public Manager()
{
}
}
public class Map
{
     public Cell[] cells;
     //....//
public Map() 
{
}
}
 
public class Cell
{
     public int index = 0;
     //....//
     private int num_tex = 0;
     public Static_Data.EnumType type;
public Cell()
{
}
}
 
public static Static_Data
{
public enum EnumType {Вид1, Вид2, Вид3};
//....//
}
Добавлено через 43 минуты
Да, прошу прощения - в одном варианет сериалуется класс Map, в другом варианте - Manager

Добавлено через 3 часа 49 минут
Если бы эта ошибка была на моем компе - можно было бы её отловить как-то, однако - у меня все в порядке, я даже логирование сделал что бы отловить ошибку, но ничего кроме инфы о неком статичном поле не смог получить.
0
1012 / 849 / 223
Регистрация: 15.06.2012
Сообщений: 3,347
Записей в блоге: 1
19.03.2013, 17:10 4
А работает на вашем компе в рамках одного запущенного приложения? Или сохранил - вышел из программы, запустил программу заново - открыл, всё нормально?
0
10 / 10 / 0
Регистрация: 17.01.2013
Сообщений: 441
19.03.2013, 17:37 5
Цитата Сообщение от wladimir90 Посмотреть сообщение
Провожу десериализацию из файла - на компе разработки все нормально, на компе пользователя - выходит ошибка что статичные поля класса нельзя сериализовать.
При этом, в десериализуемом классе у меня нет ни одного поля static, и в классах на которые он ссылается - тоже.
Единственное - есть public поле тип которого - перечисление, объявленное в статичном классе. Но на моем компьютере это не приводит к ошибке.
В чем может быть причина?
я две недели бился с сериализациями, пробывал и ручные и бинарные и xml, на клиенте не хотело десериализировать, хоть ты тресни, плюнул, щас делаю тоже самое но в xml, без сериализаций
PS: встретите Билла Гейтса, оторвите ему реки и вставьте левую на место правой, а правую на место левой, может тогда человеческое ПО делать начнут
0
Эксперт .NET
14842 / 11229 / 2947
Регистрация: 17.09.2011
Сообщений: 18,812
19.03.2013, 18:37 6
wladimir90, хотелось бы именно рабочий код глянуть — там может быть банальная опечатка, которой, разумеется, не будет в заново набранном примере.

Не по теме:

Цитата Сообщение от kelod Посмотреть сообщение
встретите Билла Гейтса, оторвите ему реки и вставьте левую на место правой, а правую на место левой, может тогда человеческое ПО делать начнут
Подобные фразы характеризуют человека как не очень умного.

0
10 / 10 / 0
Регистрация: 17.01.2013
Сообщений: 441
19.03.2013, 19:16 7
Цитата Сообщение от kolorotur Посмотреть сообщение

Не по теме:


Подобные фразы характеризуют человека как не очень умного.

Не по теме:


т.е. вы хотите сказать что у майкрософта всё гладко и с фраймворком и с виндой и много много с чем ещё?
хорошо, раз вы так считаете пусть будет так

0
1 / 1 / 0
Регистрация: 20.02.2012
Сообщений: 28
24.03.2013, 00:38  [ТС] 8
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
public class Map
{
    public string name; 
    public string description; 
 
    public int width_map;
 
    public int height_map;
 
    public int size_cell = 28;
 
    public Cell[] cells; // Список ячеек клеток
 
    public Map(string name_ = "default", int width_map_ = 18, int height_map_ = 12, Cell[] cells_ = null)
    {
        name = name_;
        width_map = width_map_;
        height_map = height_map_;
        if (cells_ != null)
            cells = cells_;
        else
            cells = new Cell[width_map * height_map];
    }
 
    /// <summary>
    /// Для сериализатора
    /// </summary>
    public Map()
    {
 
    }
}
 
public class Cell
{
 
    public bool started_trade = false;
 
    public Static_Data.Type_Groung type_ground = Static_Data.Type_Groung.Земля; // Тип клетки
 
    public Building building; // Строение на клетке
 
    public int ruins = 0;
 
    public bool improved;
 
    public bool trade; // Ячейка куплена
 
    public int number_texture = 0;
 
    public int index;
 
    public Cell()
    {
 
    }
}
 
// Строение. Хранит информацию о каждом типе строения
public class Building
{
    public int index = 0;
 
    public Static_Data.Type_Building type_building; // Тип строения
 
    public bool block;
 
    public bool season_block;
 
    public bool matherial_block; // Признак простоя
 
    public int built = -1;
 
    public int current_healt_bult = 0; // Текущее состояние постройки
 
    public int number_texture = 0;
}
Вот сериализуемый участок. Как видите тут только два обращения к статике - Static_Data.Type_Building и Static_Data.Type_Groung. Обе переменных заданы внутри статичного класса как public enum.
Вот логирование возникающей ошибки. Повторюсь - на двух компах из трех такой ошибки не возникает.

Код
24.03.2013 0:08:13 ; Возникла ошибка при отражении типа "Map"., System.InvalidOperationException: Невозможно сериализовать Static_Data. Статические типы не могут использоваться в качестве параметров или возвращаемых типов.
   в System.Xml.Serialization.TypeDesc.CheckSupported()
   в System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
   в System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference)
   в System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
   в System.Xml.Serialization.StructModel.GetFieldModel(FieldInfo fieldInfo)
   в System.Xml.Serialization.StructModel.GetFieldModel(MemberInfo memberInfo)
   в System.Xml.Serialization.XmlReflectionImporter.InitializeStructMembers(StructMapping mapping, StructModel model, Boolean openModel, String typeName, RecursionLimiter limiter)
   в System.Xml.Serialization.XmlReflectionImporter.ImportStructLikeMapping(StructModel model, String ns, Boolean openModel, XmlAttributes a, RecursionLimiter limiter)
   в System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter), System.Collections.ListDictionaryInternal+NodeKeyValueCollection, System.Xml,    в System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, Boolean repeats, Boolean openModel, RecursionLimiter limiter)
   в System.Xml.Serialization.XmlReflectionImporter.ImportElement(TypeModel model, XmlRootAttribute root, String defaultNamespace, RecursionLimiter limiter)
   в System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
   в System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace)
   в System.Xml.Serialization.XmlSerializer..ctor(Type type)
   в Xml.ReadMap(String path)
0
Темная сторона .Net
590 / 487 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
24.03.2013, 00:43 9
wladimir90, Static_Data и поля\методы используемые от него нужно пометить как XmlAttributes.XmlIgnore Property

Не по теме:

И в самом деле :sorry: что это мелкие статик данные не сериализуют

0
10 / 10 / 0
Регистрация: 17.01.2013
Сообщений: 441
24.03.2013, 00:56 10
если кому интересно, то я сделал сделал всё без сериализации хоть очень не хотел, но пришлось делать хмл строку и пересылать, на клиенте превращать в нужное мне дерево, немного проблемы с скорость на сервере, но это потому что мне было лень и сделал рекурсию с xdocument нужно потом переделать в xmlreader, а так всё работает, на данном этапе я доволен
0
1 / 1 / 0
Регистрация: 20.02.2012
Сообщений: 28
24.03.2013, 01:15  [ТС] 11
Цитата Сообщение от Noob.net Посмотреть сообщение
wladimir90, Static_Data и поля\методы используемые от него нужно пометить как XmlAttributes.XmlIgnore Property
Что то не хочет устанавливать [XmlIgnoreAttribute] ни на статичный класс ни на объявления перечислений в нем... Еще не пробовал переопределять процесс сериализации, завтра попробую.

kelod
К сожалению не мой случай - у меня задача просто сохранения / чтения из файла. У меня раньше был класс "ручного" чтения xml, через XmlDocument - но уж очень все громоздко, и нужно менять структуру при изменении её в классах.
0
Темная сторона .Net
590 / 487 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
24.03.2013, 01:18 12
wladimir90, так не в нем(статическом классе),а в классе которые сериализуете, может что пропустил, но примерно так.
C#
1
2
3
4
5
6
7
[Serializable]
public class Cell
{
 
    public bool started_trade = false;
    [XmlIgnore]
    public Static_Data.Type_Groung type_ground = Static_Data.Type_Groung.Земля;
0
10 / 10 / 0
Регистрация: 17.01.2013
Сообщений: 441
24.03.2013, 01:42 13
kelod
К сожалению не мой случай - у меня задача просто сохранения / чтения из файла. У меня раньше был класс "ручного" чтения xml, через XmlDocument - но уж очень все громоздко, и нужно менять структуру при изменении её в классах.
у меня тоже была такая задача и тоже было громоздко, но ничего не придумал лучше, не я , не на форуме народ
0
1 / 1 / 0
Регистрация: 20.02.2012
Сообщений: 28
30.03.2013, 00:32  [ТС] 14
Цитата Сообщение от kelod Посмотреть сообщение
у меня тоже была такая задача и тоже было громоздко, но ничего не придумал лучше, не я , не на форуме народ
Для моего случая решение найдено. Как я уже писал, в публичных классах используется перечисления объявленные в статичном классе. Оказалось что ошибка именно из-за этого. Я запретил их использовать в сериализации через [XmlIgnor] и сделал копию этих полей, но типом строка. После сериализации просто сделал парсинг строки в перечисление.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2013, 00:32

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Сериализация и десериализация в одном из методов не работает как положено
в двух классах есть методы сериализации и десериализации, в одном все работает нормально, во втором...

На одном работает, а на другом нет
Есть проблема.Дело в том, что когда я навожу на круг курсор, то круг1 двигается, а круг2 нет, но...

На одном сервере работает, а на другом нет
В общем проблема такая: У меня на локальном сервере все работает, перенес на другой сервер, выдает...

Флешка на одном компе работает, а на другом нет
Имеется флешка Transcend 8gb, после юзанья женой перестала работать, выдает &quot;не удалось получить...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.