corso pratico di c# - 2013
DESCRIPTION
Slide del corso "Corso pratico di C#" tenute al Politecnico di Milano/Statale a fine 2013TRANSCRIPT
Come imparare a programmare e sopravvivere
Corso pratico di C#
Matteo ValorianiMicrosoft Student Partner
Obiettivi del corso• Fornire le basi teoriche per sviluppare
programmare con un linguaggio ad oggetti
• Fornire le basi pratiche per utilizzare il framework .Net
• Familiarizzare con i tool di sviluppo
2
Calendario e programma18/10 Intro - sala conferenze DEIB (16.15-19.00)• Introduzione a VS 2013 • Introduzione al linguaggio C# e alla programmazione a oggetti• Hello word C# • Dreamspark
3/12 Lezione 1 - Basi per lo sviluppo C# - sala conferenze (14.15-18.00)• WPF (XAML)• Eventi, Delegati• Eccezioni• File, Serializzazione
3
Calendario e programma10/12 Lezione 2 - Utilizzo di sensori e interfacce grafiche - sala seminari (14.30-19.00)• Data Binding, • Dispatcher, • Utilizzo sensori (GPS, NFC, Accelerometri)• Sviluppo su telefoni
17/12 Lezione 3 - Utilizzo servizi remoti - sala seminari (14.15 -18.00) • Applicazioni sync/async, • Utilizzo servizi remoti• Sviluppo su tablet
4
Link utili
Libri e esempi:• http://csharpcourse.com/• http://msdn.microsoft.com/it-it/library/aa287551(v=VS.71).aspx• http://www.microsoft.com/italy/beit/Default.aspx
Software:• http://www.asict.polimi.it/software/microsoft/msdn-academic-alliance.html• https://www.dreamspark.com/default.aspx• http://weblogs.asp.net/sreejukg/archive/2011/01/06/documenting-c-library-using-gh
ostdoc-and-sandcastle.aspx• http://grantpalin.com/2010/01/10/net-projects-generating-documentation-with-sand
castle/
5
Programmazione a Oggetti
6
Prima della programmazione OOAnni ‘50 e inizio anni ’60, programmazione a spaghetti:Basata sul salto incondizionato GOTO
Anni ’60, programmazione strutturata:GOTO = ALTERNATIVA + RIPETIZIONE + SEQUENZAProgramma come workflow
7
Prima della programmazione OOAnni ’60, programmazione Modulare:Programma composto da moduli che cooperanoOgni modulo è indipendenteModuli riusabili Sviluppo separato
8
I primi linguaggi OOFine anni ’60, ideata la programmazione a oggetti
Anni ’70, nasce il primo linguaggio a oggetti SmallTalk
Anni ’80, vengono sviluppati ADA e C++ e si diffonde la programmazione ad oggetto
9
Principi di Programmazione OOAstrazione dell’idea di programma:Prende spunto dal mondo «reale» per creare un mondo «virtuale»Ogni programma è un insieme di «Oggetti» che interagiscono
Le «Classi»:Idea platonica della forma, laDichiarazione delle strutture dati interne
Operazioni, «metodi», che si possono eseguire sulla struttura dati
Le classi costituiscono dei modelli astratti, che a tempo di esecuzione sono istanziati per creare oggetti software. Questi ultimi sono dotati di proprietà e di metodi secondo quanto dichiarato dalle rispettive classi.
10
OggettiStato di un oggettoLo stato rappresenta la condizione in cui si trova l’oggettoLo stato è definito dai valori delle variabili interne all'oggetto (proprietà)
Comportamento di un oggetto (behavior)Determina come agisce e reagisce un oggettoÈ definito dall’insieme di operazioni che l’oggetto può compiere (metodi)
11
Oggetto vs Classe12
Compile Time
Run Time
Studente
Mario
Laura
Studente.class
CLR
Stessa struttura, ma dati diversi. Sono due
diverse istanze.
Identity=1
Identity=2
Istanze13
Persona______________________
Nome = «Mario»Cognome = «Verdi»
Indirizzo = «Via Roma»Numero = «3»
_____________________MangiareDormire
Cambiare abitazione
persona1
Nome istanza dell’oggetto
Nome Classe
Valore dell’attributo
Nome dell’attributo
Operazioni che la classe è in grado di fare
Caratteristiche Linguaggio OOIncapsulamento:
i dati che definiscono lo stato interno di un oggetto sono accessibili solo ai metodi dell'oggetto stesso.
Per alterare lo stato interno dell'oggetto, è necessario invocarne i metodi.
L'oggetto è come una black-box, cioè una «scatola nera» di cui attraverso l'interfaccia è noto cosa fa, ma non come lo fa.
Information hiding, gestione della visibilità di quello che accade dentro la scatola
14
Caratteristiche Linguaggio OO (2)Ereditarietà:
Permette di derivare nuove classi a partire da quelle già definite.
Una classe derivata, sottoclasse, mantiene i metodi e gli attributi delle classi da cui deriva (classi base, o superclassi)
La sottoclasse può definire i propri metodi o attributi e può ridefinire i metodi ereditati (overriding)
Quando una classe eredita da una sola superclasse si parla di eredità singola; viceversa, si parla di eredità multipla.
Meccanismo per ottenere l'estensibilità e il riuso del codice
15
Caratteristiche Linguaggio OO (3)Polimorfismo:
Le istanze di una sottoclasse possono essere utilizzate al posto di istanze della superclasse
I metodi che vengono ridefiniti in una sottoclasse sono detti polimorfi, in quanto lo stesso metodo si comporta diversamente a seconda del tipo di oggetto su cui è invocato.
16
Altre keywordInterfaccia:Tipi e operazioni definiti in un componente che sono visibili fuori del componente stesso.
Specifica:Funzionamento del componente, espresso mediante proprietà osservabili attraverso l'interfaccia.
Implementazione:Strutture dati e funzioni definiti dentro al componente, non necessariamente visibili da fuori.
17
Pensare ad oggettiIn un programma di tipo procedurale, si è soliti iniziare a ragionare in maniera top-down, partendo cioè dal main e creando mano a mano tutte le procedure necessarie.
Pensare ad oggetti vuole dire identificare gli oggetti che entrano in gioco nel programma che vogliamo sviluppare e saperne gestire l'interazione degli uni con gli altri.
Nella programmazione ad oggetti serve definire prima le classi e poi associare ad esse le proprietà ed i metodi opportuni.
18
Come si scelgono gli oggetti?Cosa si vuole che sia in grado di fare?Un oggetto che abbia uno o due soli metodi deve fare riflettereOggetti senza o con troppi metodi sono, in genere, da evitare
Quali proprietà sono necessarie affinché l'oggetto sia in grado di eseguire le proprie azioni?Attributi, proprietà che descrivono le caratteristiche peculiari di un oggetto (peso, altezza, …)Componenti, proprietà che sono atte a svolgere delle azioni(testa, mani, piedi, …)Peer objects, proprietà che a loro volta sono identificate e definite in altri oggetti (auto di una persona,…)
19
Accoppiamento & CoesioneAccoppiamento: quanto sono legate (dipendenze reciproche) due unità separate di un programma.
Coesione: quantità e eterogeneità dei task di cui una singola unità (una classe o un metodo) è responsabile. Se una classe ha una responsabilità ristretta ad un solo compito il valore della coesione è elevato.
Obiettivo: alta coesione e basso accoppiamento
20
C#
Storia (solo un po’)In principio fu la luce ….
Gennaio 1999, Anders Hejlsberg crea un team per realizzare un nuovo linguaggio chiamato Cool, C-like Object Oriented Language
Gennaio 2002, il framework .Net è disponibile per il download e il linguaggio è rinominato C#
Settembre 2005, esce la v.2, C# diventa una valida alternativa a Java
Agosto 2007, esce la v.3 e successivamente la 3.5 (attualmente la più usata) che introducono elementi funzionali nel linguaggio
Aprile 2010, esce la v.4
22
Caratteristiche di C#Multi-paradigm programming language
Language interoperability(C/C++, VB,…)
Interoperabilità via standard web(SOAP, XML,…)
Linguaggio Object Oriented (Tutto è DAVVERO un oggetto)
23
Framework .NetAmbiente di programmazione orientato agli oggetti coerente
Minimizzi la distribuzione del software e i conflitti di versioni.
Esecuzione sicura anche dei codici creati da produttori sconosciuti o semi-trusted.
Eliminare i problemi di prestazioni degli ambienti basati su script o interpretati.
Rendere coerente l'esperienza dello sviluppatore attraverso tipi molto vari di applicazioni (web, windows, mobile)
Generare tutte le comunicazioni in base agli standard industriali per assicurare che il codice basato su .NET Framework possa integrarsi con qualsiasi altro codice.
24
Architettura25
Ora iniziamo veramente
Visual studio 2013Integrated Development Environment (IDE)
Supporto a molti linguaggi: C, C++, C#, F#, Visual Basic .Net e ASP .Net
Integra la tecnologia IntelliSense la quale permette di correggere errori prima ancora di compilare
27
Console Application No componenti visuali (buttons, text boxes, etc.)
Solo output di testo
Due tipi:MS-DOS prompt - Windows 95/98/MECommand prompt - Windows 2000/NT/XP
28
Struttura di un progetto29
Insieme di progetti
Progetto: raccoglie classi che realizzano il programma
File .CS : contiene il codice C# di una classe
Cartella che contiene le librerie
Ciao Corso30
using System;
namespace CiaoCorso{ class Program { static void Main(string[] args) { // Scrive sulla console System.Console.WriteLine("Ciao Corso"); // Aspettta che la persona digiti un carattere System.Console.ReadKey(); } }}
Indica dove prendere le librerie usate
Metodo per raggruppare le funzionalità
Nome della classe
Metodo speciale: punto di ingresso dell’applicazione. Ogni applicazione ne deve avere uno.
Ciao Corso (2)31
// Scrive sulla console System.Console.WriteLine("Ciao Corso");
// Aspettta che la persona digiti un carattere System.Console.ReadKey();
Commenti
Namespace
OggettoMetodo
Strutture base: CicliFor: for (int i = 0; i < length; i++)
{//fai qualcosa}While: while (condizione==true)
{ //fai qualcosa }Do:do{//fai qualcosa } while (condizione== true);
32
Numero fisso di volte
Finche la condizione è vera il ciclo continua
Strutture base: Cicli(2)For:foreach (Persona item in listaPersone) { item.ChiSei(); }
33
AlternativeIf if (condizione == true) {//fai qualcosa }else {//fai qualcosa}
Switch switch (switch_on) { case 1://fai qualcosa break; case 2://fai qualcosa break; default: //fai qualcosa }
34
Calendario e programma
3/12 Lezione 1 - Basi per lo sviluppo C# - sala conferenze (14.15-18.00)
9/12 Lezione 2 - Utilizzo di sensori e interfacce grafiche – GOLGI 206(16.00-19.00)10/12 Lezione 2 – Smart and Beyond: Nokia – sala conferenze (9.15-13.00)10/12 Lezione 2 – Smart and Beyond: Lab Nokia – sala seminari (15.15-18.00)
17/12 Lezione 3 - Utilizzo servizi remoti – GOLGI 207 (14.15 -18.00) 18/12 Lezione 2 – Smart and Beyond: Windows 8.1 – sala conferenze (14.15-17.00)18/12 Lezione 2 – Smart and Beyond: Lab Windows 8– sala conferenze (17.15-19.00)
http://matteovaloriani.eventbrite.com/
35
Creare una classeclass NomeClasse { //Proprità visibilità tipo nomeProrpietà;
//Costruttore public NomeClasse() { }
//Metodi visibilità tipoRitornato nomeMetodo1() { } }
36
Convenzioni dei nomi(2)37
Identificatore Case Esempio
Classe Pascal AppDomain
Tipo di enumerazione Pascal ErrorLevel
Valori di enumerazione Pascal FatalError
Evento Pascal ValueChanged
Classe dell'eccezione Pascal WebException
Campo statico di sola lettura Pascal RedValue
Interfaccia Pascal IDisposable
Metodo Pascal ToString
Spazio dei nomi Pascal System.Drawing
Parametro Camel typeName
Property Pascal BackColor
Modificatori di accesso38
public Nessuna restrizione di accesso.
protected L'accesso è limitato alla classe di appartenenza o ai tipi derivati dalla classe di appartenenza.
internal L'accesso è limitato all'assembly corrente.
protected internal L'accesso è limitato all'assembly corrente o ai tipi derivati dalla classe di appartenenza.
private L'accesso è limitato al tipo di appartenenza.
Tipi• Signed sbyte, short, int, long• Unsigned byte, ushort, uint, ulong• Character char• Floating-point float, double, decimal• Logical bool• Reference object, string
In realtà tutti sono tipi «alias» di oggetti:• object: System.Object• string: System.String• bool: System.Boolean• int: System.Int32
39
Campi e ProprietàLe proprietà consentono a una classe di esporre un modo pubblico per ottenere e impostare valori, nascondendo tuttavia il codice di implementazione o di verifica.
private string email; public string Email { get { return email; } set { email = value; } }
40
Parola chiave usata alla fine di metodi che restituiscono un valore
Parola chiave, si riferisce al valore passato che vogliamo assegnare
Abilito la letture, get, e la scrittura della proprietà, set
Campo
Proprietà
Enum• Modo efficiente per definire un insieme di costanti integrali che possono
essere assegnate a una variabile• Per impostazione predefinita, il tipo sottostante di ogni elemento
dell'enumerazione è int, ma si può assegnare altri tipi numerici• Si può assegnare in modo esplicito il valore
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; enum MachineState { PowerOff = 0, Running = 5, Sleeping = 10, Hibernating = Sleeping + 5 }
Days meetingDay = Days.Monday;Console.WriteLine(meetingDay ); //Monday
41
Metodi«Azioni» che permettono di interagire con gli oggetti
42
public string ChiSei() { string result = ""; result = "Io sono " + nome + " " + cognome + "/n"; result = result + "La mia email è " + email; return result; }
Creo una stringa vuota
Il simbolo + viene usato per «concatenare», cioè unire, le stringhe
Alla stringa iniziale concateno altre parti
Valore restituito dalla funzione
Tipo restituito
CostruttoriServono per creare l’istanza della classe, cioè l’oggetto usato durante l’esecuzione del programma
private string Nome; private string Cognome;
public Persona(string Nome, string Cognome) { this.Nome = Nome; this.Cognome = Cognome; }
La keyword this permette di risolvere i problemi di nomi
43
OverloadMetodo con stesso nome, ma con parametri diversi o con valore di ritorno diverso
public Persona(string Nome, string Cognome, ) { this.Nome = Nome; this.Cognome = Cognome; }
public Persona(string nome, string cognome, string email) { this.nome = nome; this.cognome = cognome; this.email = email; }
44
Utilizzo dei metodi static void Main(string[] args) { Persona mario = new Persona("Mario", "Verdi");
mario.Email = "[email protected]";
string rit = mario.ChiSei(); Console.Write(rit); Console.ReadKey(); }
45
La keyword new, serve per creare nuovi oggetti. Si usa prima del costruttore
Le proprietà si utilizzano semplicemente con = senza le ()
Classica chiamata di un metodo con valore di ritorno
EreditarietàPermette di estendere classi già esistenti con nuove funzionalità, senza dover riscrivere tutto il codice
class Studente : Persona { … }
• La classe Studente(S) è effettivamente sia Studente che Persona(P).• È possibile utilizzare un'operazione di «cast» per convertire S in un
oggetto P. L'operazione di cast non implica la modifica dell'oggetto S, ma limita semplicemente la visualizzazione dell'oggetto S ai dati e ai comportamenti dell'oggetto P
• Dopo aver eseguito il cast di un oggetto S in un oggetto P, è possibile eseguire il cast dell'oggetto P per convertirlo di nuovo in S.
• Non è possibile fare il cast da P a S se l’oggetto non è un istanza di S.
46
Nuova classe
Classe da cui eredita
Richiamo costruttore base private int matricola; public Studente(string nome, string cognome,
int matricola) : base(nome, cognome) { this.matricola = matricola; }
• La keyword «base» che richiama i metodi della classe base, in questo caso direttamente il costruttore, e gli passa i parametri
• Dopo l’esecuzione del costruttore della classe base, vengono eseguite le operazioni rimanenti.
47
Richiamo costruttore base(2) private int matricola; public Studente(string nome, string cognome,
int matricola) : base(nome, cognome) { this.matricola = matricola; }• La keyword «base» che richiama i metodi della classe base, in questo caso
direttamente il costruttore, e gli passa i parametri• Dopo l’esecuzione del costruttore della classe base, vengono eseguite le operazioni
rimanenti.
public Studente(string nome, string cognome) : this(nome, cognome, 00000) { }
• In questo caso il costruttore richiama il costruttore definito prima settando un valore di default per la matricola
48
Override• Sostituisco un metodo della classe base
public virtual string ChiSei()
public override string ChiSei() { string result = base.ChiSei(); result = result + "\n" + "La mia matricola è " +
matricola; return result; }
49
Nella classe base aggiungo la parola «virtual»
Nella sottoclasse aggiungo la parola «override» prima del metodo
Classi e metodi «abstract»• Non è possibile creare un'istanza di una classe astratta. • Scopo di una classe astratta è di fornire una definizione comune di
una classe base condivisibile da più classi derivate.public abstract class A { // Class members here. }
• Le classi astratte possono inoltre definire metodi astratti aggiungendo la parola chiave abstract prima del tipo restituito del metodo
public abstract class A { public abstract void DoWork(int i);
}• I metodi astratti non prevedono implementazione• La definizione del metodo è seguita da un punto e virgola.• Le classi derivate della classe astratta devono implementare tutti i
metodi astratti.
54
«interface»• Le interfacce vengono definite tramite la parola chiave «interface»• Un'interfaccia è un gruppo completamente astratto di membri che può essere
considerato come la definizione di un contratto: chi implementa una interfaccia si impegna a scrivere il codice per ciascun metodo.
• I membri delle interfacce sono automaticamente pubblici.public interface IEsempio {
void Metodo1(); bool Metodo2();
string Proprieta1 { get; set; } int Proprieta2 { get; }
}public class Esempio : Iesempio{// Implementazione. }
55
Struttura ad oggetti56
Classe Astratta
Interfaccia
Classe Concret
a1
Classe Concret
a2
Descrive i metodi che tutte le classi devono implementare
Implementazione dei metodi validi per tutte le classi
Implementazione specifica dei metodi e funzionalità aggiuntive
Classi e metodi «Static»• Le classi statiche e i relativi membri vengono utilizzati per creare dati e
funzioni a cui sia possibile accedere senza creare un'istanza della classe. • Una classe può essere dichiarata statica per indicare che contiene solo
membri statici.• Non è possibile creare istanze di una classe statica utilizzando la parola
chiave new. • Spesso usate come classi di supporto
static class TempConverter { public static double CelsiusToFahrenheit(string temperatureCelsius){
double celsius = System.Double.Parse(temperatureCelsius); double fahrenheit = (celsius * 9 / 5) + 32;
return fahrenheit; }//... }
57
Convenzioni dei nomi• Convenzione Pascal:
• La prima lettera dell'identificatore e la prima lettera di ogni parola concatenata successiva sono in maiuscolo. È possibile utilizzare la convenzione Pascal per gli identificatori costituiti da tre o più caratteri. (BackColor)
• Convenzione Camel:• La prima lettera dell'identificatore è in minuscolo, mentre
la prima lettera di ogni parola concatenata successiva è in maiuscolo. (backColor)
59
EccezioniThrow:static double SafeDivision(double x, double y) {
if (y == 0) throw new System.DivideByZeroException();
return x / y; }
63
Parola chiave per «sollevare» le eccezioni
Eccezioni(2)Try/Cath/Finally:try {
result = SafeDivision(a, b);Console.WriteLine("{0} divided by {1} = {2}", a, b, result);
}catch (DivideByZeroException e) {
Console.WriteLine("Divisione per 0"); }catch (Exception e) {
Console.WriteLine("Altra eccezione"); }finally {Console.WriteLine("Fine programma");
Cosolole.ReadLine(); }
64
In questo blocco si inseriscono le operazioni che si tentano di eseguire
Istruzioni da eseguire se si verificano Eccezioni di tipo DivideByZeroException
Operazioni che volgiamo comunque eseguire
Istruzioni da eseguire se si verificano Eccezioni di tipo diverso da DivideByZeroException
Eccezioni(3)• Se per una determinata eccezione non sono presenti gestori,
l'esecuzione del programma verrà interrotta con un messaggio di errore
• Gli oggetti eccezione contengono informazioni dettagliate sull'errore, ad esempio lo stato dello stack di chiamate e una descrizione dell'errore
• È meglio evitare la gestione delle eccezioni, cercando di prevedere le cause che possono portare ad una situazione imprevista
• Un abuso di try...catch può appesantire molto un programma
65
Eccezioni Personalizzate class MiaException : Exception{ public MiaException() : base() { } public MiaException(string message) : base(message) {} public MiaException(string message, System.Exception inner)
: base(message, inner) { } protected MiaException(System.Runtime.Serialization. SerializationInfo info,System.Runtime.Serialization. StreamingContext context) { }
}
• Costruttori che dovrebbero essere implementati nella nuova classe• È possibile aggiungere altri costruttori e metodi
66
Delegati• Meccanismo per associare ad un metodo un
implementazione realizzata da un’altro metodo• Simile ai puntatori a finzione del C e alle callback di
C++• I delegati si possono sommare (+=) e sottrarre (-=)
67
Delegati(2)public delegate double Delegato(double dVal); // dichiaro un metodo che può essere delegatoclass Program { static void Main(string[] args) { Program pr = new Program(); // associo al metodo delegato una implementazione Delegato q = new Delegato(pr.Quadrato); q += new Delegato(pr.Cubo); // eseguo le normali operazioni sul delegato double dVal = Double.Parse(Console.ReadLine()); dVal = q(dVal); Console.ReadKey(); } //implementazione del metodo quadrato public double Quadrato(double dVal) {
Console.WriteLine("sono il delegato calcolo il quadrato di " + dVal + " : " + dVal*dVal); return dVal*dVal; } //implementazione del metodo cubo public double Cubo(double dVal) {
Console.WriteLine("sono il delegato calcolo il cubo di " + " : " + dVal * dVal*dVal); return dVal* dVal * dVal; } }
68
Eventi• Gli eventi sono simili alle chiamate di metodo, ma la
loro invocazione deve essere generata esternamente.
• Un esempio è la pressione di un pulsante in una interfaccia grafica o una pagina web.
• Tramite gli eventi una classe o un oggetto sono in grado di segnalare ad altre classi o oggetti una situazione di interesse.
• La classe che genera l'evento è chiamata autore e le classi che gestiscono l'evento sono chiamate «hendler».
69
Eventi(2) class OggettoConEvento { public event EventHandler nuovoEvento; public void ScatenaEvento( { if (nuovoEvento != null) nuovoEvento(this, EventArgs.Empty); } }
class Program { static void Main(string[] args) { OggettoConEvento obj = new OggettoConEvento(); obj.nuovoEvento += new EventHandler(obj_nuovoEvento); System.Threading.Thread.Sleep(1000*4); obj.ScatenaEvento(); }
static void obj_nuovoEvento(object sender, EventArgs e) { Console.WriteLine("si è scatenato un evento"); Console.ReadKey(); } }
70
Operazioni su file• La classe statica File permette le operazioni sui file• Verificare che un file esiste:
File.Exists(FILE_NAME);
• FileStream permette di accedere o creare un file:FileStream fs = new FileStream("test.txt",
FileMode.Open, FileAccess.ReadWrite);
• Sempre chiudere il file al termine delle operazioni o le modifiche potrebbero andare perse:
fs.Close();
71
Scrivere e leggere su fileStreamWriter sr = new StreamWriter(fs);sr.Write(text);sr.Close();
StreamReader sr = new StreamReader("test.txt");string res = sr.ReadLine();sr.Close();
72
Prende come parametro uno Stream o il nome del file
Esistono varie modalità di scrittura
Analogo al Writer
Scrivere e leggere su file• Attenzione a gestire le numerose eccezioni che
possono essere sollevate• Si può eseguire operazioni anche in file binario
(BinaryWriter e BinaryReader)• Esistono molte variazioni sul tema
73
Serializzazione• Utile per salvare un oggetto in un supporto di memorizzazione lineare
(un file o un'area di memoria) o per trasmetterlo su una connessione di rete
• In forma binaria o può utilizzare codifiche testuali (XML,…)• Lo stato dell'oggetto può essere ricreato nello stesso identico stato
dal processo inverso, chiamato deserializzazione.• La serializzazione mina l'incapsulamento di un tipo di dato astratto
esponendone potenzialmente i dettagli implementativi privati. • Per scoraggiare i concorrenti dal realizzare prodotti compatibili con i
propri spesso i produttori di software proprietari mantengono segreti i dettagli dei formati di serializzazione dei loro programmi. Alcuni offuscano o cifrano deliberatamente i dati serializzati.
74
Serializzazione C#• Per rendere un oggetto serializzabile basta aggiungere l’attributo [Serializable] prima della classe
[Serializable]public class Persona {// classe}
• Di default tutte le proprietà e i campi diventano serializzabili, anche quelli privati, è possibile disabilitare la serializzazione con l’attributo [NonSerialized]
[NonSerialized]private string tempCount;
75
Serializzazione BinariaFileStream fs = new FileStream("Serializzazione.txt",
FileMode.OpenOrCreate);
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, mario);Persona marioDes = (Persona)bf.Deserialize(fs);
fs.Close();
77
File o stream dove salvare l’oggetto
Oggetto per le operazioni di serializzazione
Serializzazione e deserializzazione
Chiudi il file
Serializzazione Xml• Serializzazione SOAP: stessa procedura di prima
utilizzando la classe SoapFormatter • System.Runtime.Serialization.Formatters.Soap.dll
• Esiste un altro modo per serializzare in XML e personalizzare il file di output• Maggiore interoperabilità • Semplicità di gestione • Migliore compatibilità all’indietro• E’ possibile serializzare soltanto membri pubblici e non
privati di una classe• Non è possibile serializzare oggetti grafici
78
Serializzazione XML(2)FileStream fs = new FileStream("Serializzazione.txt",
FileMode.OpenOrCreate); XmlSerializer xs = new XmlSerializer(typeof(Persona));
xs.Serialize(fs, mario);Persona mario = (Persona)xs.Deserialize(fs);fs.Close();
• La classe Persona deve implementare un costruttore senza parametripublic Persona(string nome, string cognome, string email){}
79
Tipo dell’oggetto che si vuole serializzare
Serializzazione e deserializzazione
Serializzazione XML(3)Attributi che possono essere aggiunti per personalizzare il file di output:
• [XmlIgnore()], permette di non serializzare un membro pubblico• [XmlElement(ElementName = "TaxRate")], permette di cambiare il nome
dell’attributo nel file xml• [XmlArray("ListaPersona")], permette di definire il nome di una lista di oggetti• [XmlArrayItem("Persona")], permette di definire il nome degli elementi dentro
una lista
80