JSON DataContract working + upgrade the settings for both

pull/39/head
Alexandre AGOSTINHO 2 years ago
parent a7d0de57f4
commit 81c85dfb60

@ -11,13 +11,18 @@ Console.WriteLine("Hello, World!\n\n");
// TESTS:
DataManager dataMgr = new DataManager(new DataContractXML());
//DataManager dataMgr = new DataManager(new Stubs());
//DataManager dataMgr = new DataManager(new DataContractXML(xmlFolderPath: "../../../../DataPersistence/data"));
DataManager dataMgr = new DataManager(new DataContractJSON(jsonFolderPath: "../../../../DataPersistence/data"));
RecipeCollection rc = new RecipeCollection("All recipes", dataMgr.Data["recipes"].Cast<Recipe>().ToArray());
Recipe? ret = SearcherRecipe.ResearchOn(rc);
Console.WriteLine(ret);
//dataMgr.Serializer = new DataContractXML();
//dataMgr.Serializer = new DataContractXML(xmlFolderPath: "../../../../DataPersistence/data");
//dataMgr.Serializer = new DataContractJSON(jsonFolderPath: "../../../../DataPersistence/data");
dataMgr.Save();
// press any key to quit

@ -0,0 +1,62 @@
using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace DataPersistence
{
public class DataContractJSON : IDataManager
{
private string _jsonFolderPath;
private DataContractJsonSerializerSettings _dataContractJsonSerializerSettings;
public DataContractJSON(string jsonFolderPath = "",
DataContractJsonSerializerSettings? dataContractJsonSerializerSettings = null)
{
_jsonFolderPath = jsonFolderPath;
if (dataContractJsonSerializerSettings is null)
_dataContractJsonSerializerSettings = new DataContractJsonSerializerSettings()
{
KnownTypes = new[] { typeof(Recipe) }
};
else
_dataContractJsonSerializerSettings = dataContractJsonSerializerSettings;
}
public Dictionary<string, List<object>> Load()
{
Dictionary<string, List<object>>? elements = new Dictionary<string, List<object>>();
var jsonSerializer = new DataContractJsonSerializer(typeof(Dictionary<string, List<object>>), _dataContractJsonSerializerSettings);
using (FileStream stream = File.OpenRead(Path.Combine(_jsonFolderPath, "data.json")))
{
elements = jsonSerializer.ReadObject(stream) as Dictionary<string, List<object>>;
}
if (elements is null)
throw new ArgumentNullException("elements");
return elements;
}
public void Save(Dictionary<string, List<object>> elements)
{
var jsonSerializer = new DataContractJsonSerializer(typeof(Dictionary<string, List<object>>), _dataContractJsonSerializerSettings);
using (FileStream stream = File.Create(Path.Combine(_jsonFolderPath, "data.json")))
{
using (var jsonWriter = JsonReaderWriterFactory.CreateJsonWriter(
stream: stream,
encoding: System.Text.Encoding.UTF8,
ownsStream: false,
indent: true))
{
jsonSerializer.WriteObject(jsonWriter, elements);
}
}
}
}
}

@ -13,21 +13,33 @@ namespace DataPersistence
{
private string _xmlFolderPath;
private XmlWriterSettings _xmlWriterSettings;
private DataContractSerializerSettings _dataContractSerializerSettings;
public DataContractXML(string xmlFolderPath = "",
XmlWriterSettings? xmlWriterSettings = null)
XmlWriterSettings? xmlWriterSettings = null,
DataContractSerializerSettings? dataContractSerializerSettings = null)
{
_xmlFolderPath = xmlFolderPath;
if (xmlWriterSettings is null)
_xmlWriterSettings = new XmlWriterSettings() { Indent = true };
else
_xmlWriterSettings = xmlWriterSettings;
if (dataContractSerializerSettings is null)
_dataContractSerializerSettings = new DataContractSerializerSettings()
{
KnownTypes = new Type[] { typeof(Recipe) },
PreserveObjectReferences = true
};
else
_dataContractSerializerSettings = dataContractSerializerSettings;
}
public Dictionary<string, List<object>> Load()
{
Dictionary<string, List<object>>? elements = new Dictionary<string, List<object>>();
var serializer = new DataContractSerializer(typeof(Dictionary<string, List<object>>), new Type[] { typeof(Recipe) });
var serializer = new DataContractSerializer(typeof(Dictionary<string, List<object>>), _dataContractSerializerSettings);
using (Stream s = File.OpenRead(Path.Combine(_xmlFolderPath, "data.xml")))
{
elements = serializer.ReadObject(s) as Dictionary<string, List<object>>;
@ -41,7 +53,7 @@ namespace DataPersistence
public void Save(Dictionary<string, List<object>> elements)
{
var serializer = new DataContractSerializer(typeof(Dictionary<string, List<object>>), new Type[] { typeof(Recipe) });
var serializer = new DataContractSerializer(typeof(Dictionary<string, List<object>>), _dataContractSerializerSettings);
using (TextWriter textWriter = File.CreateText(Path.Combine(_xmlFolderPath, "data.xml")))
{
using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, _xmlWriterSettings))

@ -12,11 +12,8 @@ namespace DataPersistence
public IDataManager Serializer { get; set; }
public Dictionary<string, List<object>> Data { get; private set; }
public DataManager(IDataManager dataMgr, string? path = null)
public DataManager(IDataManager dataMgr)
{
//if (path is null) path = "..//..//..//..//data";
//Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), path));
Serializer = dataMgr;
Data = Serializer.Load();
}

@ -10,4 +10,8 @@
<ProjectReference Include="..\Model\Model.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="data\" />
</ItemGroup>
</Project>

@ -0,0 +1,168 @@
[
{
"Key": "recipes",
"Value": [
{
"__type": "recipe:#Model",
"id": 3005,
"preparation-steps": [
{
"description": "Faire cuire.",
"order": 1
},
{
"description": "Manger.",
"order": 2
}
],
"title": "Cookies classiques"
},
{
"__type": "recipe:#Model",
"id": 28377,
"preparation-steps": [
{
"description": "Moulinez la pâte.",
"order": 1
},
{
"description": "Faire cuire pendant une bonne heure.",
"order": 2
},
{
"description": "Sortir du four et mettre dans un plat.",
"order": 3
}
],
"title": "Cookies au chocolat"
},
{
"__type": "recipe:#Model",
"id": 10495,
"preparation-steps": [
{
"description": "Achetez les ingrédients.",
"order": 1
},
{
"description": "Préparez le matériel. Ustensiles et tout.",
"order": 2
},
{
"description": "Pleurez.",
"order": 3
}
],
"title": "Gateau nature"
},
{
"__type": "recipe:#Model",
"id": 32282,
"preparation-steps": [
{
"description": "Achetez les légumes.",
"order": 1
},
{
"description": "Préparez le plat. Ustensiles et préchauffez le four.",
"order": 2
},
{
"description": "Coupez les pommes en morceaux et disposez-les sur le plat.",
"order": 3
},
{
"description": "Mettez enfin le plat au four, puis une fois cuit, dégustez !",
"order": 4
}
],
"title": "Gateau au pommes"
},
{
"__type": "recipe:#Model",
"id": 26518,
"preparation-steps": [
{
"description": "Ajouter les oeufs.",
"order": 1
},
{
"description": "Ajouter la farine.",
"order": 2
},
{
"description": "Ajouter 100g de chocolat fondu.",
"order": 3
},
{
"description": "Mélanger le tout.",
"order": 4
},
{
"description": "Faire cuire 45h au four traditionnel.",
"order": 5
}
],
"title": "Gateau au chocolat"
},
{
"__type": "recipe:#Model",
"id": 21970,
"preparation-steps": [
{
"description": "Faire une cuisson bien sec de la dinde à la poêle",
"order": 1
},
{
"description": "Mettre la dinde au frigo.",
"order": 2
},
{
"description": "Mettre le jambon dans le micro-onde.",
"order": 3
},
{
"description": "Faire chauffer 3min.",
"order": 4
},
{
"description": "Présentez sur un plat la dinde et le jambon : Miam !",
"order": 5
}
],
"title": "Dinde au jambon"
},
{
"__type": "recipe:#Model",
"id": 12830,
"preparation-steps": [
{
"description": "Trouvez des épices de curry.",
"order": 1
},
{
"description": "Trouvez maintenant du poulet.",
"order": 2
},
{
"description": "Coupez la tête du poulet et posez-la dans un plat.",
"order": 3
},
{
"description": "Parsemez d'épices curry la tête de la poule.",
"order": 4
},
{
"description": "Mettre le tout au four traditionnel 30min.",
"order": 5
},
{
"description": "Dégustez en famille !",
"order": 6
}
],
"title": "Poulet au curry"
}
]
}
]

@ -0,0 +1,162 @@
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfKeyValueOfstringArrayOfanyTypety7Ep6D1 xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1" z:Size="1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<KeyValueOfstringArrayOfanyTypety7Ep6D1>
<Key z:Id="2">recipes</Key>
<Value z:Id="3" z:Size="7">
<anyType z:Id="4" xmlns:d4p1="http://schemas.datacontract.org/2004/07/Model" i:type="d4p1:recipe">
<d4p1:id>3005</d4p1:id>
<d4p1:preparation-steps z:Id="5" z:Size="2">
<d4p1:preparation-step z:Id="6">
<d4p1:description z:Id="7">Faire cuire.</d4p1:description>
<d4p1:order>1</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="8">
<d4p1:description z:Id="9">Manger.</d4p1:description>
<d4p1:order>2</d4p1:order>
</d4p1:preparation-step>
</d4p1:preparation-steps>
<d4p1:title z:Id="10">Cookies classiques</d4p1:title>
</anyType>
<anyType z:Id="11" xmlns:d4p1="http://schemas.datacontract.org/2004/07/Model" i:type="d4p1:recipe">
<d4p1:id>28377</d4p1:id>
<d4p1:preparation-steps z:Id="12" z:Size="3">
<d4p1:preparation-step z:Id="13">
<d4p1:description z:Id="14">Moulinez la pâte.</d4p1:description>
<d4p1:order>1</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="15">
<d4p1:description z:Id="16">Faire cuire pendant une bonne heure.</d4p1:description>
<d4p1:order>2</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="17">
<d4p1:description z:Id="18">Sortir du four et mettre dans un plat.</d4p1:description>
<d4p1:order>3</d4p1:order>
</d4p1:preparation-step>
</d4p1:preparation-steps>
<d4p1:title z:Id="19">Cookies au chocolat</d4p1:title>
</anyType>
<anyType z:Id="20" xmlns:d4p1="http://schemas.datacontract.org/2004/07/Model" i:type="d4p1:recipe">
<d4p1:id>10495</d4p1:id>
<d4p1:preparation-steps z:Id="21" z:Size="3">
<d4p1:preparation-step z:Id="22">
<d4p1:description z:Id="23">Achetez les ingrédients.</d4p1:description>
<d4p1:order>1</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="24">
<d4p1:description z:Id="25">Préparez le matériel. Ustensiles et tout.</d4p1:description>
<d4p1:order>2</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="26">
<d4p1:description z:Id="27">Pleurez.</d4p1:description>
<d4p1:order>3</d4p1:order>
</d4p1:preparation-step>
</d4p1:preparation-steps>
<d4p1:title z:Id="28">Gateau nature</d4p1:title>
</anyType>
<anyType z:Id="29" xmlns:d4p1="http://schemas.datacontract.org/2004/07/Model" i:type="d4p1:recipe">
<d4p1:id>32282</d4p1:id>
<d4p1:preparation-steps z:Id="30" z:Size="4">
<d4p1:preparation-step z:Id="31">
<d4p1:description z:Id="32">Achetez les légumes.</d4p1:description>
<d4p1:order>1</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="33">
<d4p1:description z:Id="34">Préparez le plat. Ustensiles et préchauffez le four.</d4p1:description>
<d4p1:order>2</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="35">
<d4p1:description z:Id="36">Coupez les pommes en morceaux et disposez-les sur le plat.</d4p1:description>
<d4p1:order>3</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="37">
<d4p1:description z:Id="38">Mettez enfin le plat au four, puis une fois cuit, dégustez !</d4p1:description>
<d4p1:order>4</d4p1:order>
</d4p1:preparation-step>
</d4p1:preparation-steps>
<d4p1:title z:Id="39">Gateau au pommes</d4p1:title>
</anyType>
<anyType z:Id="40" xmlns:d4p1="http://schemas.datacontract.org/2004/07/Model" i:type="d4p1:recipe">
<d4p1:id>26518</d4p1:id>
<d4p1:preparation-steps z:Id="41" z:Size="5">
<d4p1:preparation-step z:Id="42">
<d4p1:description z:Id="43">Ajouter les oeufs.</d4p1:description>
<d4p1:order>1</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="44">
<d4p1:description z:Id="45">Ajouter la farine.</d4p1:description>
<d4p1:order>2</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="46">
<d4p1:description z:Id="47">Ajouter 100g de chocolat fondu.</d4p1:description>
<d4p1:order>3</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="48">
<d4p1:description z:Id="49">Mélanger le tout.</d4p1:description>
<d4p1:order>4</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="50">
<d4p1:description z:Id="51">Faire cuire 45h au four traditionnel.</d4p1:description>
<d4p1:order>5</d4p1:order>
</d4p1:preparation-step>
</d4p1:preparation-steps>
<d4p1:title z:Id="52">Gateau au chocolat</d4p1:title>
</anyType>
<anyType z:Id="53" xmlns:d4p1="http://schemas.datacontract.org/2004/07/Model" i:type="d4p1:recipe">
<d4p1:id>21970</d4p1:id>
<d4p1:preparation-steps z:Id="54" z:Size="5">
<d4p1:preparation-step z:Id="55">
<d4p1:description z:Id="56">Faire une cuisson bien sec de la dinde à la poêle</d4p1:description>
<d4p1:order>1</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="57">
<d4p1:description z:Id="58">Mettre la dinde au frigo.</d4p1:description>
<d4p1:order>2</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="59">
<d4p1:description z:Id="60">Mettre le jambon dans le micro-onde.</d4p1:description>
<d4p1:order>3</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="61">
<d4p1:description z:Id="62">Faire chauffer 3min.</d4p1:description>
<d4p1:order>4</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="63">
<d4p1:description z:Id="64">Présentez sur un plat la dinde et le jambon : Miam !</d4p1:description>
<d4p1:order>5</d4p1:order>
</d4p1:preparation-step>
</d4p1:preparation-steps>
<d4p1:title z:Id="65">Dinde au jambon</d4p1:title>
</anyType>
<anyType z:Id="66" xmlns:d4p1="http://schemas.datacontract.org/2004/07/Model" i:type="d4p1:recipe">
<d4p1:id>12830</d4p1:id>
<d4p1:preparation-steps z:Id="67" z:Size="6">
<d4p1:preparation-step z:Id="68">
<d4p1:description z:Id="69">Trouvez des épices de curry.</d4p1:description>
<d4p1:order>1</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="70">
<d4p1:description z:Id="71">Trouvez maintenant du poulet.</d4p1:description>
<d4p1:order>2</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="72">
<d4p1:description z:Id="73">Coupez la tête du poulet et posez-la dans un plat.</d4p1:description>
<d4p1:order>3</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="74">
<d4p1:description z:Id="75">Parsemez d'épices curry la tête de la poule.</d4p1:description>
<d4p1:order>4</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="76">
<d4p1:description z:Id="77">Mettre le tout au four traditionnel 30min.</d4p1:description>
<d4p1:order>5</d4p1:order>
</d4p1:preparation-step>
<d4p1:preparation-step z:Id="78">
<d4p1:description z:Id="79">Dégustez en famille !</d4p1:description>
<d4p1:order>6</d4p1:order>
</d4p1:preparation-step>
</d4p1:preparation-steps>
<d4p1:title z:Id="80">Poulet au curry</d4p1:title>
</anyType>
</Value>
</KeyValueOfstringArrayOfanyTypety7Ep6D1>
</ArrayOfKeyValueOfstringArrayOfanyTypety7Ep6D1>
Loading…
Cancel
Save