Ошибка при десериализации файла

Ошибка при десериализации файла

Последние изменения: 10.02.2022

Ошибка:

При подключении ТСД к клиенту появляется следующая ошибка:

"Внутренняя ошибка открытия документа. Подробности смотрите в errors.log"

В логе присутствует следующая ошибка:

Ошибка при открытии документа 
MESSAGE:    Ошибка при десериализации файла 'ApplicationMobileSMARTSConfigurationCleverence.Warehouse.Environment.xml', смещение: 1865

Решение:

Данная ошибка означает, что на ТСД находится битый файл конфигурации. Скопируйте из папки «стандартная конфигурация» в папку «текущая конфигурация» согласно таблице (Папки и их содержимое) и перевыгрузите номенклатуру.

Клиент работает с двумя терминалами MC32N0. С одним проблем нет, на другом часто программа зависает, приходится перегружать. После перезагрузки документ не удается восстановить. Забрал терминал, загрузил последний ром от производителя, после этого установил Mobile Smarts, удалили не сервере всю номенклатуру и заново ее загрузили. Запустили «подбор заказа» несколько позиции отсканировались без проблем, потом он опять завис.

В логе ошибок следующие записи

MobileSMARTS.exe; Подбор заказа mainApp; 19/01/2018 11:56:44.779 ERROR
ADDITION TEXT: Подбор заказа: Действие (OperationAction) «1»
MESSAGE: Ошибка при десериализации файла ‘ApplicationMobileSMARTSDocumentsf24c4c21-98e0-4889-a826-ae04f9992c74Cleverence.Warehouse.Environment.xml’, смещение: 198513
TYPE: System.Runtime.Serialization.SerializationException
[STACK TRACE]
at Cleverence.DataCollection.Xml.XmlSerializer.DeserializeFilePartially(String path, Int64 offset)
at Cleverence.Warehouse.Operation._deserializeActionsInternal()
at Cleverence.Warehouse.Operation.DeserializeActions()
at Cleverence.Warehouse.Operation.get_Actions()
at Cleverence.Warehouse.Operation.Cleverence.Warehouse.IActivity.GetActionsForActivity(IActionWorkflow wf)
at Cleverence.Warehouse.Compact.OperationAction.get_Actions()
at Cleverence.Warehouse.Compact.OperationAction.Begin()
at Cleverence.Warehouse.Compact.ActionsApplication.StartApplication()
[STACK TRACE]

—INNER EXCEPTION—
MESSAGE: The process can not access the file ‘ApplicationMobileSMARTSDocumentsf24c4c21-98e0-4889-a826-ae04f9992c74Cleverence.Warehouse.Environment.xml’ because it is being used by another process.
TYPE: System.IO.IOException
[STACK TRACE]
at System.IO.__Error.WinIOError(Int32 errorCode, String str)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync, String msgPath)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at Cleverence.DataCollection.Xml.XmlSerializer.DeserializeFilePartially(String path, Int64 offset)
at Cleverence.Warehouse.Operation._deserializeActionsInternal()
at Cleverence.Warehouse.Operation.DeserializeActions()
at Cleverence.Warehouse.Operation.get_Actions()
at Cleverence.Warehouse.Operation.Cleverence.Warehouse.IActivity.GetActionsForActivity(IActionWorkflow wf)
at Cleverence.Warehouse.Compact.OperationAction.get_Actions()
at Cleverence.Warehouse.Compact.OperationAction.Begin()
at Cleverence.Warehouse.Compact.ActionsApplication.StartApplication()
[STACK TRACE]

На другом терминале подобных проблем не возникает. Что можно сделать в данной ситуации

Filislav

339 / 285 / 62

Регистрация: 02.09.2010

Сообщений: 547

1

05.07.2011, 10:12. Показов 10112. Ответов 10

Метки нет (Все метки)


Есть программа — записная книжка, записи сериализуются в Xml. Если программа запускается первый раз и файла с сериализованными записями еще не созданно, то все работает хорошо, сериализуется.
Но при втором запуске, когда файл уже есть, при десериализации выскакивает ошибка: «В документе XML(1,40) присутствует ошибка». Естественно программа дальше не работает. В чем может быть дело?
Вот код программы:

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.Xml.Serialization;
using System.Xml;
using System.Runtime.Serialization;
namespace Dialer
{
    public partial class Form1 : Form
    {
        Dialer dialer = new Dialer();
        DataTable dt = new DataTable();
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            dialer.Cont.Add(new Entrie(monthCalendar1.SelectionRange.Start, dateTimePicker1.Value, comboBox1.SelectedItem.ToString(), textBox1.Text.ToString()));
            XmlWriter writer = new XmlTextWriter(@"D:data.xml", Encoding.UTF8);
            XmlSerializer serializer = new XmlSerializer(typeof(Dialer));
            serializer.Serialize(writer, dialer);
            writer.Close();
            MessageBox.Show("Встреча добавлена");
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            dt.Clear();
            foreach (Entrie en in dialer.Cont)
            {
                dt.Rows.Add(en.Dt.ToShortDateString(), en.Time.ToLongTimeString(), en.Tip, en.Opisanie);
            }
            dataGridView1.DataSource = dt;
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void monthCalendar2_DateSelected(object sender, DateRangeEventArgs e)
        {
            dt.Clear();
            foreach (Entrie en in dialer.Cont)
            {
                if (monthCalendar2.SelectionStart.ToShortDateString() == en.Dt.ToShortDateString())
                {
                    dt.Rows.Add(en.Dt.ToShortDateString(), en.Time.ToLongTimeString(), en.Tip, en.Opisanie);
                }
 
            }
            dataGridView1.DataSource = dt;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            dt.Columns.Add("Дата");
            dt.Columns.Add("Время");
            dt.Columns.Add("Тип события");
            dt.Columns.Add("Описание");
            if (File.Exists(@"D:data.xml"))
            {
                XmlReader reader = new XmlTextReader(@"D:data.xml");
                XmlSerializer serializer = new XmlSerializer(typeof(Entrie));
                dialer = (Dialer)serializer.Deserialize(reader);
                reader.Close();
            }
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            
        }
    }
}

0

Мохаммед Али

131 / 69 / 5

Регистрация: 14.08.2009

Сообщений: 916

05.07.2011, 10:16

2

а что такое Dialer где он описан?

0

Filislav

339 / 285 / 62

Регистрация: 02.09.2010

Сообщений: 547

05.07.2011, 10:26

 [ТС]

3

Dialer это сриализуемая коллекция обьектов Entrie.

Вот он:

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.Collections;
 
namespace Dialer
{
    public class Dialer
    {
        private ArrayList content = new ArrayList();
        [XmlArray]
        [XmlArrayItem(typeof(Entrie))]
        public IList Cont
        {
            get
            {
                return content;
            }
        }
        public Dialer()
        {
        }
            
 
    }
 
    
}

0

Мохаммед Али

131 / 69 / 5

Регистрация: 14.08.2009

Сообщений: 916

05.07.2011, 11:42

4

ну не знай может надо к аррей лист контент прибавит тэг [NonSerialized] и почему у вас аррей лист а там тип как бы неизвестен в аттрибутах указываете Ентри, можете попробовать сделать через List<type>.

0

Sanprof

96 / 96 / 16

Регистрация: 28.01.2008

Сообщений: 426

05.07.2011, 11:46

5

я уверен такое сообщение выдает когда сериализация прошла не до конца, тоесть часть свойств сериализовалась, потом возникла ошибка, и файл не дописался.
Filislav, я же вам давал рабочий код по сериализации объекта, который работает на 100% но вы решили своим кодом, теперь отлавливайте ошибки!
чем вас это не устраивает

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
111
112
113
public static class XmlWorker     {         /// <summary>         /// Загрузка объекта из потока         /// </summary>         /// <param name="typeObject">Тип объект, экземпляр класса которого нужно десериализовать</param>         /// <param name="source">Источник откуда будет десериализован объек</param>         /// <returns>Возвращает десериализованный объект</returns>         public static object LoadFromStream( Type typeObject, MemoryStream source )         {             try             {                 XmlSerializer xs = new XmlSerializer( typeObject );                 source.Seek( 0, 0 );                 return xs.Deserialize( source );             }             catch             {                 return null;             }         }           /// <summary>         /// Сохранение объекта в поток         /// </summary>         /// <param name="sender">Объект, экземпляр класса которого нужно сериализовать</param>         /// <returns>Возвращает поток, в котором находится сериализованный объект</returns>         public static MemoryStream SaveToStream( object sender )         {             MemoryStream dest = new MemoryStream();             try             {                 XmlSerializer xs = new XmlSerializer( sender.GetType() );                 xs.Serialize( dest, sender );                 dest.Seek( 0, 0 );                 return dest;             }             catch             {                 return null;             }         }           /// <summary>         /// Загрузка объекта из Xml файла         /// </summary>         /// <param name="typeObject">Тип объект, экземпляр класса которого нужно десериализовать</param>         /// <param name="XmlFileName">Имя xml-файла</param>         /// <returns>Возвращает десериализованный объект</returns>         public static object LoadFromXmlFile( Type typeObject, string XmlFileName )         {             TextReader tr = new StreamReader( XmlFileName, Encoding.UTF8 );             try             {                 XmlSerializer sr = new XmlSerializer( typeObject );                 return sr.Deserialize( tr );             }             catch             {                 return null;             }             finally             {                 tr.Close();             }         }           /// <summary>         /// Сохранение объекта в Xml файл         /// </summary>         /// <param name="sender">Объект, экземпляр класса которого нужно сериализовать</param>         /// <param name="XmlFileName">Имя xml-файла</param>         /// <param name="connString">Строка соединения с базой данных</param>         public static void SaveToXmlFile( object sender, string XmlFileName )         {             FileInfo fSource = null;             FileInfo fDest = null;             string fileName = Path.GetFileName( XmlFileName );             if (File.Exists( XmlFileName ))             {                 fSource = new FileInfo( XmlFileName );                 Directory.SetCurrentDirectory( Path.GetDirectoryName( XmlFileName ) );                 fSource.CopyTo( "copy_" + fileName, true );                 fSource = null;                 fDest = new FileInfo( "copy_" + fileName );                 fDest.Attributes = FileAttributes.Hidden;             }             TextWriter tw = new StreamWriter( XmlFileName, false, Encoding.UTF8 );             try             {                 XmlSerializer sr = new XmlSerializer( sender.GetType() );                 sr.Serialize( tw, sender );             }             catch             {                 tw.Close();                 if (fDest != null)                     fDest.CopyTo( XmlFileName, true );                 fSource = new FileInfo( XmlFileName );                 fSource.Attributes = FileAttributes.Normal;                 fSource = null;             }             finally             {                 tw.Close();                 if (fDest != null)                 {                     fDest.Delete();                     fDest = null;                 }             }         }     }

0

Мохаммед Али

131 / 69 / 5

Регистрация: 14.08.2009

Сообщений: 916

05.07.2011, 11:53

6

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

1

Sanprof

96 / 96 / 16

Регистрация: 28.01.2008

Сообщений: 426

05.07.2011, 12:22

7

Цитата
Сообщение от asd321
Посмотреть сообщение

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

десериализация не может быть выполнена, если была выполнена не правильная сериализация.
Filislav, почитайте правила сериализации объектов, там есть пунктик (свойство обязательно должно иметь методы get и set), а у вас

C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
public class Dialer     {          private ArrayList content = new ArrayList();          [XmlArray]          [XmlArrayItem(typeof(Entrie))]          public IList Cont                 {              get              {                  return content;              }          }          public Dialer()          {          } }

1

Filislav

339 / 285 / 62

Регистрация: 02.09.2010

Сообщений: 547

05.07.2011, 12:40

 [ТС]

8

Нашел я ошибку у себя, все заработало. И сериализация у меня выполнена просто без лишних наворотов и правильно.
Sanprof, ваш код я конечно же сохранил еще в первый раз.Спасибо. Ошибка была:

Вместо:

C#
1 2 3 4 
XmlReader reader = new XmlTextReader(@"D:data.xml");                 XmlSerializer serializer = new XmlSerializer(typeof(Entrie));                 dialer = (Dialer)serializer.Deserialize(reader);                 reader.Close();

Надо было:

C#
1 2 3 4 
XmlReader reader = new XmlTextReader(@"D:data.xml");                 XmlSerializer serializer = new XmlSerializer(typeof(Dialer));// здесь исправлено.                 dialer = (Dialer)serializer.Deserialize(reader);                 reader.Close();

Просто просмотрел.

0

Мохаммед Али

131 / 69 / 5

Регистрация: 14.08.2009

Сообщений: 916

05.07.2011, 12:41

9

да да он прав чо то я упустил)

0

Filislav

339 / 285 / 62

Регистрация: 02.09.2010

Сообщений: 547

05.07.2011, 13:21

 [ТС]

10

Вопрос не по теме, касаемо моей программы. Как мне ArrayList отсортировать. Мне надо чтобы в DataGridView выводил в порядке возрастания даты. Свойва OrderBy() у нее нету. Подскажите плиз.
Вот в этом куске кода.

C#
1 2 3 4 5 6 7 8 9 10 11 12 13 
   private void monthCalendar2_DateSelected(object sender, DateRangeEventArgs e)         {             dt.Clear();             foreach (Entrie en in dialer.Cont)             {                 if (monthCalendar2.SelectionStart.ToShortDateString() == en.Dt.ToShortDateString())                 {                     dt.Rows.Add(en.Dt.ToShortDateString(), en.Time.ToLongTimeString(), en.Tip, en.Opisanie);                 }               }             dataGridView1.DataSource = dt;         }

Сортировка нужна по en.Dt.ToShortDateString().

0

96 / 96 / 16

Регистрация: 28.01.2008

Сообщений: 426

05.07.2011, 13:28

11

Filislav, почитайте про лямбда-выражения, в инете много ссылок как сортировать листы.

1

There is no problem with serialize but deserializing throw error like below. I shared all related classes and error. What should I do to deserialize this file.

yaml file (created by yaml serializing) :

  Edits:   0:
Id: 20
Type: AddOrUpdate
Operation:
book:
ElementName: a
ArithmeticExpression: asd
ConditionExpression: a

c# classes :

 public class DbContext
{
public Dictionary<int, DbModel> Edits { get; set; }
}
public class DbModel
{
public int Id { get; set; }
public string Type { get; set; }
public Dictionary<string, Operation> Operation { get; set; }
public DbModel(int id, string type, Dictionary<string, Operation> op)
{
Id = id;
Type = type;
Operation = op;
}
}
public class Operation
{
public string ElementName { get; set; }
public string ArithmeticExpression { get; set; }
public string ConditionExpression { get; set; }
public Operation(string elemName, string ArithmetticExp, string ConditionExp)
{
ElementName = elemName;
ArithmeticExpression = ArithmetticExp;
ConditionExpression = ConditionExp;
}
}
class DatabaseOperation
{
public static DbContext DbContext { get; set; }
public const string yamlEditString = "C:Datasetting.yml";
static DatabaseOperation()
{
DbContext = ReadAllDataFromFile().Result;
}
public static Task<DbContext> ReadAllDataFromFile()
{
DbContext dbCon = new DbContext();
if (File.Exists(yamlEditString))
{
var deserializer = new Deserializer();
string readedData = File.ReadAllText(yamlEditString);
//dbCon.Edits = deserializer.Deserialize<List<DbModel>>(readedData);
try
{
dbCon = deserializer.Deserialize<DbContext>(readedData);
}
catch (Exception ex)
{
throw;
}
}
else
{
dbCon.Edits = new Dictionary<int, DbModel>();
}
return Task.FromResult(dbCon);
}
public static Task WriteAllDataToFile(DbContext dbCon)
{
var serializer = new Serializer();
File.WriteAllText(yamlEditString, serializer.Serialize(dbCon));
}
}

getting this error :
(Line: 7, Col: 9, Idx: 86) — (Line: 7, Col: 9, Idx: 86): Exception during deserialization

«YamlDotNet»

inner exception :

Failed to create an instance of type ‘YamlEdit.Operation’.

at
YamlDotNet.Serialization.ObjectFactories.DefaultObjectFactory.Create(Type
type) at
YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser
parser, Type expectedType, Func`3 nestedObjectDeserializer, Object&
value) at
YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser
parser, Type expectedType, SerializerState state, IValueDeserializer
nestedObjectDeserializer)

StackTrace :

   at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.<>c__DisplayClass3_0.<DeserializeValue>b__0(IParser r, Type t)
at YamlDotNet.Serialization.NodeDeserializers.DictionaryNodeDeserializer.DeserializeHelper(Type tKey, Type tValue, IParser parser, Func`3 nestedObjectDeserializer, IDictionary result)
at YamlDotNet.Serialization.NodeDeserializers.DictionaryNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func`3 nestedObjectDeserializer, Object& value)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.<>c__DisplayClass3_0.<DeserializeValue>b__0(IParser r, Type t)
at YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func`3 nestedObjectDeserializer, Object& value)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.Deserializer.Deserialize(IParser parser, Type type)
at YamlDotNet.Serialization.Deserializer.Deserialize[T](String input)
at YamlEdit.DatabaseOperation.ReadAllDataFromFile() in D:RepositoriesYamlEditDatabaseOperation.cs:line 35

There is no problem with serialize but deserializing throw error like below. I shared all related classes and error. What should I do to deserialize this file.

yaml file (created by yaml serializing) :

  Edits:   0:
Id: 20
Type: AddOrUpdate
Operation:
book:
ElementName: a
ArithmeticExpression: asd
ConditionExpression: a

c# classes :

 public class DbContext
{
public Dictionary<int, DbModel> Edits { get; set; }
}
public class DbModel
{
public int Id { get; set; }
public string Type { get; set; }
public Dictionary<string, Operation> Operation { get; set; }
public DbModel(int id, string type, Dictionary<string, Operation> op)
{
Id = id;
Type = type;
Operation = op;
}
}
public class Operation
{
public string ElementName { get; set; }
public string ArithmeticExpression { get; set; }
public string ConditionExpression { get; set; }
public Operation(string elemName, string ArithmetticExp, string ConditionExp)
{
ElementName = elemName;
ArithmeticExpression = ArithmetticExp;
ConditionExpression = ConditionExp;
}
}
class DatabaseOperation
{
public static DbContext DbContext { get; set; }
public const string yamlEditString = "C:Datasetting.yml";
static DatabaseOperation()
{
DbContext = ReadAllDataFromFile().Result;
}
public static Task<DbContext> ReadAllDataFromFile()
{
DbContext dbCon = new DbContext();
if (File.Exists(yamlEditString))
{
var deserializer = new Deserializer();
string readedData = File.ReadAllText(yamlEditString);
//dbCon.Edits = deserializer.Deserialize<List<DbModel>>(readedData);
try
{
dbCon = deserializer.Deserialize<DbContext>(readedData);
}
catch (Exception ex)
{
throw;
}
}
else
{
dbCon.Edits = new Dictionary<int, DbModel>();
}
return Task.FromResult(dbCon);
}
public static Task WriteAllDataToFile(DbContext dbCon)
{
var serializer = new Serializer();
File.WriteAllText(yamlEditString, serializer.Serialize(dbCon));
}
}

getting this error :
(Line: 7, Col: 9, Idx: 86) — (Line: 7, Col: 9, Idx: 86): Exception during deserialization

«YamlDotNet»

inner exception :

Failed to create an instance of type ‘YamlEdit.Operation’.

at
YamlDotNet.Serialization.ObjectFactories.DefaultObjectFactory.Create(Type
type) at
YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser
parser, Type expectedType, Func`3 nestedObjectDeserializer, Object&
value) at
YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser
parser, Type expectedType, SerializerState state, IValueDeserializer
nestedObjectDeserializer)

StackTrace :

   at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.<>c__DisplayClass3_0.<DeserializeValue>b__0(IParser r, Type t)
at YamlDotNet.Serialization.NodeDeserializers.DictionaryNodeDeserializer.DeserializeHelper(Type tKey, Type tValue, IParser parser, Func`3 nestedObjectDeserializer, IDictionary result)
at YamlDotNet.Serialization.NodeDeserializers.DictionaryNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func`3 nestedObjectDeserializer, Object& value)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.<>c__DisplayClass3_0.<DeserializeValue>b__0(IParser r, Type t)
at YamlDotNet.Serialization.NodeDeserializers.ObjectNodeDeserializer.YamlDotNet.Serialization.INodeDeserializer.Deserialize(IParser parser, Type expectedType, Func`3 nestedObjectDeserializer, Object& value)
at YamlDotNet.Serialization.ValueDeserializers.NodeValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.ValueDeserializers.AliasValueDeserializer.DeserializeValue(IParser parser, Type expectedType, SerializerState state, IValueDeserializer nestedObjectDeserializer)
at YamlDotNet.Serialization.Deserializer.Deserialize(IParser parser, Type type)
at YamlDotNet.Serialization.Deserializer.Deserialize[T](String input)
at YamlEdit.DatabaseOperation.ReadAllDataFromFile() in D:RepositoriesYamlEditDatabaseOperation.cs:line 35

Я десериализирую следующий файл XML. Использование XML-сериализатора с VSTS 2008 + С# +.Net 3.5.

Вот файл XML.

<?xml version="1.0" encoding="utf-8"?>
<Person><Name>=b?olu</Name></Person>

Вот снимок экрана для отображения файла XML и двоичного формата файла XML,

alt text

alt text

Если есть какие-то решения принять таких персонажей, это будет здорово! Поскольку мой XML файл большой, и если такие символы действительно недопустимы и должны быть отфильтрованы, я хочу сохранить оставшееся содержимое XML файла после десериализации.

В настоящее время десериализация XML завершается с InvalidOperationException, и вся информация XML файла будет потеряна.

На самом деле, при открытии этого XML файла в VSTS возникает ошибка, подобная этой: ошибка 1 символа ‘?’, Шестнадцатеричное значение 0xffff недопустимо в документах XML. Я запутался, так как в двоичной форме нет значений 0xffff.

Любые решения или идеи?

EDIT1: вот мой код, который используется для десериализации файла XML,

    static void Foo()
{
XmlSerializer s = new XmlSerializer(typeof(Person));
StreamReader file = new StreamReader("bug.xml");
s.Deserialize(file);
}
public class Person
{
public string Name;
}

Всем доброго времени суток, написал 2 метода 1-й сериализации, 2-й — десериализации, и при десериализации получаю следующие исключение:

Не удалось привести тип объекта «System.Int32» к типу
«binary.Classes.Serializ».

[Serializable]
class Serializ
{
public Int32 Line { get; set; }
BinaryFormatter formatter = new BinaryFormatter();
public void SerializSave (Int32 _line)
{
Line = _line;
using (FileStream fs = new FileStream(@"E:DELETEnr.dat", FileMode.Append))
{
formatter.Serialize(fs, Line);
Console.WriteLine("Объект сериализован");
}
}
public void SerializRead()
{
using (FileStream fs = new FileStream(@"E:DELETEnr.dat", FileMode.Open))
{
Serializ _serial = (Serializ)formatter.Deserialize(fs);
Console.WriteLine("Объект десериализован");
Console.WriteLine("Прочитано: {0}", _serial.Line);
}
}
}

Как исправить ошибку данного характера ? что я не так сделал ? спасибо

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

Additional information: Тип
«System.Runtime.Serialization.Formatters.Binary.BinaryFormatter» в
сборке «mscorlib, Version=4.0.0.0, Culture=neutral,

Пробовал и так FileMode.Append и так FileMode.Create
Странно что на этот раз не так? и еще хотел спросить FileMode.Create — даст мне дозапись данных в файл ? мне это важно. Спасибо

Filislav

339 / 285 / 62

Регистрация: 02.09.2010

Сообщений: 547

1

05.07.2011, 10:12. Показов 10246. Ответов 10

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Есть программа — записная книжка, записи сериализуются в Xml. Если программа запускается первый раз и файла с сериализованными записями еще не созданно, то все работает хорошо, сериализуется.
Но при втором запуске, когда файл уже есть, при десериализации выскакивает ошибка: «В документе XML(1,40) присутствует ошибка». Естественно программа дальше не работает. В чем может быть дело?
Вот код программы:

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
using System.Xml.Serialization;
using System.Xml;
using System.Runtime.Serialization;
namespace Dialer
{
    public partial class Form1 : Form
    {
        Dialer dialer = new Dialer();
        DataTable dt = new DataTable();
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            dialer.Cont.Add(new Entrie(monthCalendar1.SelectionRange.Start, dateTimePicker1.Value, comboBox1.SelectedItem.ToString(), textBox1.Text.ToString()));
            XmlWriter writer = new XmlTextWriter(@"D:data.xml", Encoding.UTF8);
            XmlSerializer serializer = new XmlSerializer(typeof(Dialer));
            serializer.Serialize(writer, dialer);
            writer.Close();
            MessageBox.Show("Встреча добавлена");
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            dt.Clear();
            foreach (Entrie en in dialer.Cont)
            {
                dt.Rows.Add(en.Dt.ToShortDateString(), en.Time.ToLongTimeString(), en.Tip, en.Opisanie);
            }
            dataGridView1.DataSource = dt;
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void monthCalendar2_DateSelected(object sender, DateRangeEventArgs e)
        {
            dt.Clear();
            foreach (Entrie en in dialer.Cont)
            {
                if (monthCalendar2.SelectionStart.ToShortDateString() == en.Dt.ToShortDateString())
                {
                    dt.Rows.Add(en.Dt.ToShortDateString(), en.Time.ToLongTimeString(), en.Tip, en.Opisanie);
                }
 
            }
            dataGridView1.DataSource = dt;
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            dt.Columns.Add("Дата");
            dt.Columns.Add("Время");
            dt.Columns.Add("Тип события");
            dt.Columns.Add("Описание");
            if (File.Exists(@"D:data.xml"))
            {
                XmlReader reader = new XmlTextReader(@"D:data.xml");
                XmlSerializer serializer = new XmlSerializer(typeof(Entrie));
                dialer = (Dialer)serializer.Deserialize(reader);
                reader.Close();
            }
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            
        }
    }
}



0



Мохаммед Али

131 / 69 / 5

Регистрация: 14.08.2009

Сообщений: 916

05.07.2011, 10:16

2

а что такое Dialer где он описан?



0



Filislav

339 / 285 / 62

Регистрация: 02.09.2010

Сообщений: 547

05.07.2011, 10:26

 [ТС]

3

Dialer это сриализуемая коллекция обьектов Entrie.

Вот он:

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using System.Collections;
 
namespace Dialer
{
    public class Dialer
    {
        private ArrayList content = new ArrayList();
        [XmlArray]
        [XmlArrayItem(typeof(Entrie))]
        public IList Cont
        {
            get
            {
                return content;
            }
        }
        public Dialer()
        {
        }
            
 
    }
 
    
}



0



Мохаммед Али

131 / 69 / 5

Регистрация: 14.08.2009

Сообщений: 916

05.07.2011, 11:42

4

ну не знай может надо к аррей лист контент прибавит тэг [NonSerialized] и почему у вас аррей лист а там тип как бы неизвестен в аттрибутах указываете Ентри, можете попробовать сделать через List<type>.



0



Sanprof

96 / 96 / 16

Регистрация: 28.01.2008

Сообщений: 426

05.07.2011, 11:46

5

я уверен такое сообщение выдает когда сериализация прошла не до конца, тоесть часть свойств сериализовалась, потом возникла ошибка, и файл не дописался.
Filislav, я же вам давал рабочий код по сериализации объекта, который работает на 100% но вы решили своим кодом, теперь отлавливайте ошибки!
чем вас это не устраивает

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
111
112
113
public static class XmlWorker
    {
        /// <summary>
        /// Загрузка объекта из потока
        /// </summary>
        /// <param name="typeObject">Тип объект, экземпляр класса которого нужно десериализовать</param>
        /// <param name="source">Источник откуда будет десериализован объек</param>
        /// <returns>Возвращает десериализованный объект</returns>
        public static object LoadFromStream( Type typeObject, MemoryStream source )
        {
            try
            {
                XmlSerializer xs = new XmlSerializer( typeObject );
                source.Seek( 0, 0 );
                return xs.Deserialize( source );
            }
            catch
            {
                return null;
            }
        }
 
        /// <summary>
        /// Сохранение объекта в поток
        /// </summary>
        /// <param name="sender">Объект, экземпляр класса которого нужно сериализовать</param>
        /// <returns>Возвращает поток, в котором находится сериализованный объект</returns>
        public static MemoryStream SaveToStream( object sender )
        {
            MemoryStream dest = new MemoryStream();
            try
            {
                XmlSerializer xs = new XmlSerializer( sender.GetType() );
                xs.Serialize( dest, sender );
                dest.Seek( 0, 0 );
                return dest;
            }
            catch
            {
                return null;
            }
        }
 
        /// <summary>
        /// Загрузка объекта из Xml файла
        /// </summary>
        /// <param name="typeObject">Тип объект, экземпляр класса которого нужно десериализовать</param>
        /// <param name="XmlFileName">Имя xml-файла</param>
        /// <returns>Возвращает десериализованный объект</returns>
        public static object LoadFromXmlFile( Type typeObject, string XmlFileName )
        {
            TextReader tr = new StreamReader( XmlFileName, Encoding.UTF8 );
            try
            {
                XmlSerializer sr = new XmlSerializer( typeObject );
                return sr.Deserialize( tr );
            }
            catch
            {
                return null;
            }
            finally
            {
                tr.Close();
            }
        }
 
        /// <summary>
        /// Сохранение объекта в Xml файл
        /// </summary>
        /// <param name="sender">Объект, экземпляр класса которого нужно сериализовать</param>
        /// <param name="XmlFileName">Имя xml-файла</param>
        /// <param name="connString">Строка соединения с базой данных</param>
        public static void SaveToXmlFile( object sender, string XmlFileName )
        {
            FileInfo fSource = null;
            FileInfo fDest = null;
            string fileName = Path.GetFileName( XmlFileName );
            if (File.Exists( XmlFileName ))
            {
                fSource = new FileInfo( XmlFileName );
                Directory.SetCurrentDirectory( Path.GetDirectoryName( XmlFileName ) );
                fSource.CopyTo( "copy_" + fileName, true );
                fSource = null;
                fDest = new FileInfo( "copy_" + fileName );
                fDest.Attributes = FileAttributes.Hidden;
            }
            TextWriter tw = new StreamWriter( XmlFileName, false, Encoding.UTF8 );
            try
            {
                XmlSerializer sr = new XmlSerializer( sender.GetType() );
                sr.Serialize( tw, sender );
            }
            catch
            {
                tw.Close();
                if (fDest != null)
                    fDest.CopyTo( XmlFileName, true );
                fSource = new FileInfo( XmlFileName );
                fSource.Attributes = FileAttributes.Normal;
                fSource = null;
            }
            finally
            {
                tw.Close();
                if (fDest != null)
                {
                    fDest.Delete();
                    fDest = null;
                }
            }
        }
    }



0



Мохаммед Али

131 / 69 / 5

Регистрация: 14.08.2009

Сообщений: 916

05.07.2011, 11:53

6

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



1



Sanprof

96 / 96 / 16

Регистрация: 28.01.2008

Сообщений: 426

05.07.2011, 12:22

7

Цитата
Сообщение от asd321
Посмотреть сообщение

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

десериализация не может быть выполнена, если была выполнена не правильная сериализация.
Filislav, почитайте правила сериализации объектов, там есть пунктик (свойство обязательно должно иметь методы get и set), а у вас

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Dialer     
{
         private ArrayList content = new ArrayList();
         [XmlArray]
         [XmlArrayItem(typeof(Entrie))]
         public IList Cont         
        {
             get
             {
                 return content;
             }
         }
         public Dialer()
         {
         }
}



1



Filislav

339 / 285 / 62

Регистрация: 02.09.2010

Сообщений: 547

05.07.2011, 12:40

 [ТС]

8

Нашел я ошибку у себя, все заработало. И сериализация у меня выполнена просто без лишних наворотов и правильно.
Sanprof, ваш код я конечно же сохранил еще в первый раз.Спасибо. Ошибка была:

Вместо:

C#
1
2
3
4
XmlReader reader = new XmlTextReader(@"D:data.xml");
                XmlSerializer serializer = new XmlSerializer(typeof(Entrie));
                dialer = (Dialer)serializer.Deserialize(reader);
                reader.Close();

Надо было:

C#
1
2
3
4
XmlReader reader = new XmlTextReader(@"D:data.xml");
                XmlSerializer serializer = new XmlSerializer(typeof(Dialer));// здесь исправлено.
                dialer = (Dialer)serializer.Deserialize(reader);
                reader.Close();

Просто просмотрел.



0



Мохаммед Али

131 / 69 / 5

Регистрация: 14.08.2009

Сообщений: 916

05.07.2011, 12:41

9

да да он прав чо то я упустил)



0



Filislav

339 / 285 / 62

Регистрация: 02.09.2010

Сообщений: 547

05.07.2011, 13:21

 [ТС]

10

Вопрос не по теме, касаемо моей программы. Как мне ArrayList отсортировать. Мне надо чтобы в DataGridView выводил в порядке возрастания даты. Свойва OrderBy() у нее нету. Подскажите плиз.
Вот в этом куске кода.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
   private void monthCalendar2_DateSelected(object sender, DateRangeEventArgs e)
        {
            dt.Clear();
            foreach (Entrie en in dialer.Cont)
            {
                if (monthCalendar2.SelectionStart.ToShortDateString() == en.Dt.ToShortDateString())
                {
                    dt.Rows.Add(en.Dt.ToShortDateString(), en.Time.ToLongTimeString(), en.Tip, en.Opisanie);
                }
 
            }
            dataGridView1.DataSource = dt;
        }

Сортировка нужна по en.Dt.ToShortDateString().



0



96 / 96 / 16

Регистрация: 28.01.2008

Сообщений: 426

05.07.2011, 13:28

11

Filislav, почитайте про лямбда-выражения, в инете много ссылок как сортировать листы.



1



Всем привет, столкнулся с такой ошибкой при десериализации XML файла:
System.InvalidOperationException: There is an error in XML document (2, 2).

Мой C# код, который читает файл:

[Serializable, XmlRoot("errors"), XmlType("errors")]
public class Errors
{
    [XmlType("error")]
    public class Error
    {
        [XmlElement("name")]
        public string TypeError { get; set; }
        [XmlElement("description")]
        public string Description { get; set; }
    }
    [XmlElement("error")]
    public List<Error> errors { get; private set; }
    public Errors()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Errors));

        using (Stream reader = new FileStream("ErrorString.xml", FileMode.Open))
        {
            errors = (List<Error>)serializer.Deserialize(reader);
        }
    }
}

Мой XML — документ:

<?xml version="1.0" encoding="utf-8" ?>
<errors>
    <error>
        <name>NOT_ENOUGH_SEARCH_LENGTH</name>
        <description>Require at least 3 characters</description>
    </error>
    <error>
        <name>INVALID_SEARCH</name>
        <description>The search is invalid</description>
    </error>
    <error>
        <name>SEARCH_NOT_SPECIFIED</name>
        <description>Empty search field</description>
    </error>
    <error>
        <name>INVALID_FIELDS</name>
        <description>Inputed filed isn't correct</description>
    </error>
    <error>
        <name>ACCOUNT_ID_NOT_SPECIFIED</name>
        <description>Application id haven't been provided</description>
    </error>
    <error>
        <name>METHOD_DISABLED</name>
        <description>Function in API was diasbled by Wargaming</description>
    </error>
    <error>
        <name>APPLICATION_IS_BLOCKED</name>
        <description>Your application ID have been banned by Wargaming</description>
    </error>
    <error>
        <name>INVALID_IP_ADDRESS</name>
        <description>IP address is not allow for server application</description>
    </error>
    <error>
        <name>SOURCE_NOT_AVAILABLE</name>
        <description>Data isn't available</description>
    </error>
</errors>

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

My teacher provide me the serilaized file.. I have not created it my self .. while deserilaizing the file i get following error

java.io.InvalidClassException: netflix.memreader.FeatureWriter; local class incompatible: stream classdesc serialVersionUID = 3279065858639389501, local class serialVersionUID = -7190666486441488760
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1583)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
    at netflix.memreader.FeatureWriter.deserialize(FeatureWriter.java:327)
    at netflix.memreader.MemReader.readFeaturesFromMem(MemReader.java:811)
    at netflix.memreader.MemReader.main(MemReader.java:727)
Exception in thread "main" java.lang.NullPointerException
    at netflix.memreader.MemReader.readFeaturesFromMem(MemReader.java:814)
    at netflix.memreader.MemReader.main(MemReader.java:727)

PM 77-1's user avatar

PM 77-1

12.9k21 gold badges68 silver badges111 bronze badges

asked Oct 31, 2014 at 5:58

Aiza malik's user avatar

3

As the exception says ,

local class incompatible: stream classdesc serialVersionUID, local
class serialVersionUID

The serialized object has the different serialVersionUID . when you are trying to de-serialize the object , the comipler will genrate the serialVersionUID if you dont specify the default one.

serialVersionUID may vary on same objects across different compilers (on various platforms). You may add the ,

private static final long serialVersionUID = -7190666486441488760;

answered Oct 31, 2014 at 6:09

Santhosh's user avatar

SanthoshSanthosh

8,1813 gold badges29 silver badges56 bronze badges

1

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Ошибка при десериализации ответа
  • Ошибка при делении на ноль python
  • Ошибка при делении на ноль java
  • Ошибка при декомпиляции apk

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии