added missing files

updatesEFSamplesToNetCore3
Marc CHEVALDONNE 6 years ago
parent e17c0e10e7
commit 0be1c48d2c

@ -0,0 +1,133 @@
// ========================================================================
//
// Copyright (C) 2016-2017 MARC CHEVALDONNE
// marc.chevaldonne.free.fr
//
// Module : Nounours.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-07
//
// ========================================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
namespace ex_038_006_Binary_Serializable
{
/// <summary>
/// Pour que Nounours soit sérialisable/désérialisable avec un Binary Serializer, il faut décorer le type avec l'attribut [Serializable]
/// 1) pour cela, il faut ajouter [Serializable] à la définition du type comme ci-dessous.
/// 2) contrairement au DataContract Serializer, on ne rajoute pas d'attributs pour chaque membre à sérialiser. On n'en rajoute que pour ne pas sérialiser.
/// L'attribut à ajouter dans ce cas est [NonSerialized]. Tous les autres membres publics ou privés sont sérialisés.
///
/// Attention en conséquence aux propriétés automatiques : puisqu'un membre est créé par le compilateur, celui-ci est sérialisé, mais son nom peut changer à compilation.
/// Il faut donc éviter les propriétés automatiques qui doivent être sérialisées.
///
/// Il faut également faire attention aux membres de types collection (et en particulier aux types abstraits qui sont désérialisés en Array) comme pour les DataContractSerializers.
///
/// Enfin, comme pour le DataContractSerializer, on trouve les 4 hooks : [OnDeserializing], [OnDeserialized], [OnSerializing] et [OnSerialized]
/// (enlevez l'attribut [OnDeserializing] devant la méthode Init pour constater les dégâts)
/// </summary>
[Serializable]
public class Nounours
{
public string Nom
{
get { return nom; }
set { nom = value; }
}
private string nom;
public DateTime Naissance
{
get { return naissance; }
set { naissance = value; }
}
private DateTime naissance;
public int NbPoils
{
get;
set;
}
[NonSerialized]
private int entierQuiSertARienMaisQuOnNeVeutPasSerialiser = 42;
public List<Nounours> Amis
{
get;
set;
}
public Nounours()
{
Init();
Amis = new List<Nounours>();
}
[OnDeserializing]
void Init(StreamingContext sc = new StreamingContext())
{
entierQuiSertARienMaisQuOnNeVeutPasSerialiser = 42;
}
/// <summary>
/// returns a hash code in order to use this class in hash table
/// </summary>
/// <returns>hash code</returns>
public override int GetHashCode()
{
return Nom.GetHashCode();
}
/// <summary>
/// checks if the "right" object is equal to this Nounours or not
/// </summary>
/// <param name="right">the other object to be compared with this Nounours</param>
/// <returns>true if equals, false if not</returns>
public override bool Equals(object right)
{
//check null
if (object.ReferenceEquals(right, null))
{
return false;
}
if (object.ReferenceEquals(this, right))
{
return true;
}
if (this.GetType() != right.GetType())
{
return false;
}
return this.Equals(right as Nounours);
}
/// <summary>
/// checks if this Nounours is equal to the other Nounours
/// </summary>
/// <param name="other">the other Nounours to be compared with</param>
/// <returns>true if equals</returns>
public bool Equals(Nounours other)
{
return (this.Nom.Equals(other.Nom) && this.Naissance == other.Naissance);
}
public override string ToString()
{
string amisStr = String.Empty;
if(Amis.Count > 0)
{
amisStr = $", amis : {Amis.Select(nounours => nounours.Nom).Aggregate((noms, n) => $"{noms} {n}")}";
}
return $"{Nom} ({Naissance:dd/MM/yyyy}, {NbPoils} poils{amisStr}, 42? {entierQuiSertARienMaisQuOnNeVeutPasSerialiser})";
}
}
}

@ -5,21 +5,79 @@
//
// Module : Program.cs
// Author : Marc Chevaldonné
// Creation date : 2016-10-12
// Creation date : 2016-10-07
//
// ========================================================================
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using static System.Console;
namespace ex_038_006_Binary_Serializable
{
/// <summary>
/// Pas d'équivalent en .NET Core car trop lié à Windows
/// Dirigez-vous vers un DataContractSerializer
///
/// </summary>
public class Program
class Program
{
public static void Main(string[] args)
static void Main(string[] args)
{
Directory.SetCurrentDirectory(Path.Combine(Directory.GetCurrentDirectory(), "..//..//..//..//ex_038_006_Binary_Serializable", "result"));
Nounours chewie = new Nounours()
{
Nom = "Chewbacca",
Naissance = new DateTime(1977, 5, 27),
NbPoils = 1234567
};
Nounours yoda = new Nounours()
{
Nom = "Yoda",
Naissance = new DateTime(1980, 5, 21),
NbPoils = 3
};
Nounours ewok = new Nounours()
{
Nom = "Ewok",
Naissance = new DateTime(1983, 5, 25),
NbPoils = 3456789
};
chewie.Amis.Add(yoda);
chewie.Amis.Add(ewok);
WriteLine(chewie);
//ATTENTION : pour que le Binary Serializer fonctionne, vous devez avoir décoré l'objet à sérialiser !
//cf. Nounours.cs
//1. Sérialisation d'un chewie en binaire avec la méthode par défaut
//On construit le sérialiseur binaire en précisant le formatter (BinaryFormatter ou SoapFormatter)
//- le formatter binaire est le plus efficace des deux et permet d'obtenir la sortie la plus légère
//- le formatter Soap permet d'obtenir un formatage dans le style du protocole SOAP.
// Attention, il ne prend pas en charge la sérialisation des types génériques comme List<T> !
string file = "nounours.bin";
IFormatter formatter = new BinaryFormatter();
using (FileStream stream = File.Create(file))
{
formatter.Serialize(stream, chewie);
}
//- pour désérialiser, on crée le flux (de préférence avec using) en lecture
//- on appelle Deserialize
Nounours nounours2;
using (FileStream stream = File.OpenRead(file))
{
nounours2 = formatter.Deserialize(stream) as Nounours;
}
WriteLine(nounours2);
}
}
}

@ -0,0 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
</Project>

@ -0,0 +1,4 @@
# Ignore everything in this directory
# Except this file
!.gitignore
Loading…
Cancel
Save