2015-01-21 2 views
0

Так что у меня проблемы с десериализацией файла XML.
Я использую следующую структуру.Поведение Strange XmlSerializer

[Serializable] 
public struct GraphicsOptions 
{ 
    public int Height; 
    public int Width; 
    public bool Fullscreen; 
    public bool AntiAliasing; 
    public int ClickResCount; 
} 

И следующий код для создания,

public void CreateData() 
{ 
    graphicsOptions.Height = graphics.PreferredBackBufferHeight; 
    graphicsOptions.Width = graphics.PreferredBackBufferWidth; 
    graphicsOptions.Fullscreen = graphics.IsFullScreen; 
    graphicsOptions.AntiAliasing = graphics.PreferMultiSampling; 
    graphicsOptions.ClickResCount = 1; 
    dataStream = File.Create(SavegamePath); 
    XmlSerializer serializer = new XmlSerializer(typeof(GraphicsOptions)); 
    serializer.Serialize(dataStream, graphicsOptions); 
    dataStream.Close(); 
} 

Изменение и

private void ApplyChanges() 
{ 
    graphicsOptions.Height = graphics.PreferredBackBufferHeight; 
    graphicsOptions.Width = graphics.PreferredBackBufferWidth; 
    graphicsOptions.Fullscreen = graphics.IsFullScreen; 
    graphicsOptions.AntiAliasing = graphics.PreferMultiSampling; 
    graphicsOptions.ClickResCount = clickCountResolution; 
    dataStream = File.Open(SavegamePath, FileMode.Open); 
    XmlSerializer serializer = new XmlSerializer(typeof(GraphicsOptions)); 
    serializer.Serialize(dataStream, graphicsOptions); 
    dataStream.Close(); 
} 

Загрузите XML файл

public void LoadData() 
{ 
    dataStream = File.Open(SavegamePath, FileMode.Open); 
    XmlSerializer serializer = new XmlSerializer(typeof(GraphicsOptions)); 
    graphicsOptions = (GraphicsOptions)serializer.Deserialize(dataStream); 
    dataStream.Close(); 
} 

Довольно стандартный материал, за исключением того, после того, как в третий раз Я применяю изменения, которые чтобы добавить 2 символа в конце файла: "s>".

Я понятия не имею, почему это делается, но это делает XML практически бесполезным, потому что я не могу загрузить эту информацию в свою struct.
Visual Studio дает мне InvalidOperationException (я понимаю, почему он это делает).

Любые советы или идеи о том, как предотвратить это из-за происходящего или как просто удалить 2 символа, если он поймает исключение?

+0

Это действительно помогло бы, если бы вы только дайте нам короткую, но полную программу, демонстрирующую проблему - что нужно только сохранить файл, на самом деле. –

+0

Я дал слишком много информации или недостаточно? рассматриваемая программа выполняется с помощью инфраструктуры XNA, я могу добавить логику обновления, но она не даст вам больше информации. – Matonster

+0

Смесь - слишком много (то есть некоторые посторонние вещи) и недостаточно (не краткая, но полная программа, демонстрирующая проблема). XNA * вероятно * нерелевантно - но было бы легко сказать, просто ли вы создадите короткое консольное приложение (а не фрагменты, а всего целую программу), что указывает на проблему. –

ответ

1

Это происходит потому, что ваш новый файл короче, чем раньше. Вы должны использовать FileMode.Create вместо Open/OpenOrCreate

Так Ваша функция сохранения должна выглядеть следующим образом ::

private void ApplyChanges() 
{ 
    graphicsOptions.Height = graphics.PreferredBackBufferHeight; 
    graphicsOptions.Width = graphics.PreferredBackBufferWidth; 
    graphicsOptions.Fullscreen = graphics.IsFullScreen; 
    graphicsOptions.AntiAliasing = graphics.PreferMultiSampling; 
    graphicsOptions.ClickResCount = clickCountResolution; 
    using(dataStream = File.Open(SavegamePath, FileMode.Create)) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(GraphicsOptions)); 
     serializer.Serialize(dataStream, graphicsOptions); 
    } 
} 
+0

Это не дает мне эту опцию – Matonster

+0

Извините, моя ошибка создаётся, а не пишет: https://msdn.microsoft.com/en-us/library/system.io.filemode(v=vs.110).aspx – MNie

+0

спасибо за вашу помощь, это исправило мою проблему – Matonster

0

изменить метод ApplyChanges() использовать другой FileMode, как FileMode.Create. Ниже вы можете найти правильный метод.

private void ApplyChanges() 
{ 
    graphicsOptions.Height = graphics.PreferredBackBufferHeight; 
    graphicsOptions.Width = graphics.PreferredBackBufferWidth; 
    graphicsOptions.Fullscreen = graphics.IsFullScreen; 
    graphicsOptions.AntiAliasing = graphics.PreferMultiSampling; 
    graphicsOptions.ClickResCount = clickCountResolution; 
    dataStream = File.Open(SavegamePath, FileMode.Create); // You can use FileMode.Truncate as well. 
    XmlSerializer serializer = new XmlSerializer(typeof(GraphicsOptions)); 
    serializer.Serialize(dataStream, graphicsOptions); 
    dataStream.Close(); 
    } 

См https://msdn.microsoft.com/en-us/library/system.io.filemode(v=vs.110).aspx

Смежные вопросы