Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

(C#) Не работает сериализация

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> (C#) Не работает сериализация
Имя
Сообщение << Старые топики   Новые топики >>
(C#) Не работает сериализация - 2010-04-04 21:11:29.110000   
sbk

Сообщений: 144
Оценки: 0
Присоединился: 2008-12-20 19:01:57.273333
Пытаюсь сериализовать класс, но во время исполнения вылетает ошибка. Что делать - не знаю, в гугле не нашёл(может плохо искал). В общем подскажите что не так в классе.
Вот сам класс:
[Serializable] [XmlRoot("SnakeSaveInfo")] public class game_save { public SnakeSpeeds SnakeSpeed { get; set; } public cpoint SnakeHead { get; set; } public List&lt;cpoint&gt; SnakeBody { get; set; } public Direction SnakeDirection { get; set; } public cpoint ApplePosition { get; set; } public string MapFile { get; set; } public string PlayerName { get; set; } public int PlayerScore { get; set; } public int AppleScore { get; set; } }
Direction, SnakeSpeeds - перечисления.
Post #: 1
RE: (C#) Не работает сериализация - 2010-04-04 22:37:58.880000   
kreol

Сообщений: 823
Оценки: 0
Присоединился: 2007-03-08 03:13:06.876666
Ну что за народ, ну вылетает ошибка, скажите, какая, а то всё наугад, всё наугад.
Насколько я помню, необходимо добавлять специальные аттрибуты (XmlElement, XmlAttribute) перед каждым элементом, который нужно сериализовать, а не только перед именем класса.
Post #: 2
RE: (C#) Не работает сериализация - 2010-04-04 22:49:38.700000   
sbk

Сообщений: 144
Оценки: 0
Присоединился: 2008-12-20 19:01:57.273333
Вот текст ошибки:
System.InvalidOperationException не обработано Message="Возникла ошибка при отражении типа \"snake.game_save\"." Source="System.Xml" StackTrace: в 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.ImportTypeMapping(TypeModel model, String ns, ImportContext context, String dataType, XmlAttributes a, 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) в snake.Program.SaveGame() в C:\Users\Admin\Documents\Visual Studio 2008\Projects\snake\snake\Program.cs:строка 324 в snake.Program.PauseGame(Action act) в C:\Users\Admin\Documents\Visual Studio 2008\Projects\snake\snake\Program.cs:строка 267 в snake.Program.GameTour() в C:\Users\Admin\Documents\Visual Studio 2008\Projects\snake\snake\Program.cs:строка 250 в snake.Program.Main(String[] args) в C:\Users\Admin\Documents\Visual Studio 2008\Projects\snake\snake\Program.cs:строка 240 в System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в System.Threading.ThreadHelper.ThreadStart_Context(Object state) в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) в System.Threading.ThreadHelper.ThreadStart() InnerException: System.InvalidOperationException Message="Не удается сериализовать член \"snake.game_save.SnakeHead\" типа \"snake.cpoint\". Дополнительные сведения см. во внутреннем исключении." Source="System.Xml" StackTrace: в System.Xml.Serialization.StructModel.CheckSupportedMember(TypeDesc typeDesc, MemberInfo member, Type type) в System.Xml.Serialization.StructModel.GetPropertyModel(PropertyInfo propertyInfo) в 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) InnerException: System.InvalidOperationException Message="Невозможно сериализовать snake.cpoint, т. к. он не имеет беспараметрического конструктора." InnerException:
Насчет атрибутов. Добавил. Всё равно не работает. Может я неправильные атрибуты расставил.
Вот как я это сделал:
[Serializable] [XmlRoot("SnakeSaveInfo")] public class game_save { [XmlAttribute] public SnakeSpeeds SnakeSpeed { get; set; } [XmlAttribute] public cpoint SnakeHead { get; set; } [XmlElement] [XmlArray] public List&lt;cpoint&gt; SnakeBody { get; set; } [XmlAttribute] public Direction SnakeDirection { get; set; } [XmlAttribute] public cpoint ApplePosition { get; set; } [XmlAttribute] public string MapFile { get; set; } [XmlAttribute] public string PlayerName { get; set; } [XmlAttribute] public int PlayerScore { get; set; } [XmlAttribute] public int AppleScore { get; set; } }
Post #: 3
RE: (C#) Не работает сериализация - 2010-04-04 22:54:40.703333   
sbk

Сообщений: 144
Оценки: 0
Присоединился: 2008-12-20 19:01:57.273333
Спасибо, kreol! Меня уже наставили на верный путь, так что дальше буду сам, свои же, ошибки разгребать.
Post #: 4
RE: (C#) Не работает сериализация - 2010-04-08 19:08:05.990000   
sbk

Сообщений: 144
Оценки: 0
Присоединился: 2008-12-20 19:01:57.273333
Что бы не создавать новый топик спрошу здесь. В общем есть у меня XML - файл
&lt;?xml version="1.0"?&gt; &lt;ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt; &lt;string&gt;Имя: {0}&lt;/string&gt; &lt;string&gt;Счёт: {0}&lt;/string&gt; &lt;!-- и т.д. --&gt;
Пытаюсь его десериализировать в класс List<string>. Но при выполнении выдаёт ошибку InvalidOperationException, "В документе XML (3,11) присутствует ошибка." . Насколько я понял это из за кириллицы. Что надо сделать что бы не было ошибки?

P.S. Вот полный текст исключения

System.InvalidOperationException не обработано Message="В документе XML (3, 11) присутствует ошибка." Source="System.Xml" StackTrace: в System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) в System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream) в snake.Program.LoadLanguage(String from) в C:\Users\Admin\Documents\Visual Studio 2008\Projects\snake\snake\Program.cs:строка 273 в snake.Program.LoadLocale(String language) в C:\Users\Admin\Documents\Visual Studio 2008\Projects\snake\snake\Program.cs:строка 267 в snake.Program.Main(String[] args) в C:\Users\Admin\Documents\Visual Studio 2008\Projects\snake\snake\Program.cs:строка 260 в System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в System.Threading.ThreadHelper.ThreadStart_Context(Object state) в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) в System.Threading.ThreadHelper.ThreadStart() InnerException: System.Xml.XmlException Message="Недопустимый знак для указанной кодировки. Строка 3, позиция 11." Source="System.Xml" LineNumber=3 LinePosition=11 SourceUri="" StackTrace: в System.Xml.XmlTextReaderImpl.Throw(Exception e) в System.Xml.XmlTextReaderImpl.Throw(String res, String arg) в System.Xml.XmlTextReaderImpl.Throw(Int32 pos, String res) в System.Xml.XmlTextReaderImpl.InvalidCharRecovery(Int32& bytesCount, Int32& charsCount) в System.Xml.XmlTextReaderImpl.GetChars(Int32 maxCharsCount) в System.Xml.XmlTextReaderImpl.ReadData() в System.Xml.XmlTextReaderImpl.ParseElementContent() в System.Xml.XmlTextReaderImpl.Read() в System.Xml.XmlTextReader.Read() в System.Xml.XmlReader.ReadElementString() в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderList1.Read1_ArrayOfString() InnerException: Если менять кодировку, то на какую(и как)?
Post #: 5
RE: (C#) Не работает сериализация - 2010-04-08 19:29:56.296666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
В xml явно указать кодировку? И не забыть сохранить файл именно в этой кодировке (в MSVS это File -> Advanced Save Options…).

&lt;?xml version="1.0" encoding="windows-1251"?&gt;
Post #: 6
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> (C#) Не работает сериализация







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.