1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2025-04-11 12:15:44 +02:00

Refactor FileSerializer to attempt error recovery & tweak StreamWriter usage

This commit is contained in:
chylex 2018-07-25 03:38:44 +02:00
parent 73549515eb
commit 4aec2f3260
3 changed files with 31 additions and 5 deletions

View File

@ -3,7 +3,6 @@
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Text;
using TweetDuck.Core.Utils;
@ -65,6 +64,8 @@ public void RegisterTypeConverter(Type type, ITypeConverter converter){
}
public void Write(string file, T obj){
LinkedList<string> errors = new LinkedList<string>();
WindowsUtils.CreateDirectoryForFile(file);
using(StreamWriter writer = new StreamWriter(new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None))){
@ -78,15 +79,21 @@ public void Write(string file, T obj){
if (serializer.TryWriteType(type, value, out string converted)){
if (converted != null){
writer.Write($"{prop.Key} {EscapeLine(converted)}");
writer.Write(prop.Key);
writer.Write(' ');
writer.Write(EscapeLine(converted));
writer.Write(NewLineReal);
}
}
else{
throw new SerializationException($"Invalid serialization type, conversion failed for: {type}");
errors.AddLast($"Missing converter for type: {type}");
}
}
}
if (errors.First != null){
throw new SerializationSoftException(errors.ToArray());
}
}
public void Read(string file, T obj){
@ -103,6 +110,7 @@ public void Read(string file, T obj){
throw new FormatException("Input appears to be a binary file.");
}
LinkedList<string> errors = new LinkedList<string>();
int currentPos = 0;
do{
@ -125,7 +133,8 @@ public void Read(string file, T obj){
int space = line.IndexOf(' ');
if (space == -1){
throw new SerializationException($"Invalid file format, missing separator: {line}");
errors.AddLast($"Missing separator on line: {line}");
continue;
}
string property = line.Substring(0, space);
@ -140,10 +149,14 @@ public void Read(string file, T obj){
info.SetValue(obj, converted);
}
else{
throw new SerializationException($"Invalid file format, cannot convert value: {value} (property: {property})");
errors.AddLast($"Failed reading property {property} with value: {value}");
}
}
}while(currentPos != -1);
if (errors.First != null){
throw new SerializationSoftException(errors.ToArray());
}
}
public void ReadIfExists(string file, T obj){

View File

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
namespace TweetDuck.Data.Serialization{
sealed class SerializationSoftException : Exception{
public IList<string> Errors { get; }
public SerializationSoftException(IList<string> errors) : base(string.Join(Environment.NewLine, errors)){
this.Errors = errors;
}
}
}

View File

@ -247,6 +247,7 @@
<Compile Include="Data\Serialization\FileSerializer.cs" />
<Compile Include="Data\InjectedHTML.cs" />
<Compile Include="Data\Serialization\ITypeConverter.cs" />
<Compile Include="Data\Serialization\SerializationSoftException.cs" />
<Compile Include="Data\Serialization\SingleTypeConverter.cs" />
<Compile Include="Data\TwoKeyDictionary.cs" />
<Compile Include="Data\WindowState.cs" />