Serializzatore…quale scegliere e perchè?

Diciamo, innanzitutto, che dal framework 3.0 abbiamo la possibilità di scegliere come serializzare un grafo di oggetti (che bello ora abbiamo l’imbarazzo della scelta T_T), ma in base a cosa scelgo? beh… ho fatto un pò di test ed ho evidenziato quelli che, dal mio punto di vista, potrebbero essere pregi e difetti dell’uno e dell’altro.Iniziamo rispettando i più anziani:

XmlSerializer:

  • Serializza tutte le property , tranne quelle che gli viene detto di ignorare (ricordate che lavora solo sulle property pubbliche)
  • Controllo completo sull'xml generato (posso scegliere quale property rendere un attribute e cosa un element)

DataContractSerializer:

  • Serializza solo quello che viene decorato come da serializzare (anche datamember privati)
  • può serializzare classi decorate con l'attributo [Serializable] (lo vedo un pregio se voglio usare questo serializzatore senza dover ridecorare tutte le mie classi,ma guardando l’xml generato…sembra quasi un difetto)
  • ho letto su internet che rende la serializzazione più veloce del 10% rispetto ad XmlSerializer ma sui test fatti da me siamo su un ordine leggermente diverso
    • su 1 elemento
      • DataContractSerializer 34ms 
      • XmlSerializer 204ms
    • su 900000 elementi (senza oggetti innestati)
      • DataContractSerializer 1863ms 
      • XmlSerializer 3750ms
    • su 900000 elementi (di cui 9000 con altri oggetti contenuti che contengono a loro volta altri 3000 oggetti)
      • DataContractSerializer 2458ms 
      • XmlSerializer 3691ms
  • Crea solo element e non attribute (su questo voglio indagare meglio, ma finora non ho avuto modo di fargli creare attribute), l’unico controllo che ho sui membri decorati con [DataMember] sono “IsRequired, Name, Order, DefaultValue”

 

considerando il divario prestazionale che si è creato tra le due serializzazioni, direi che se devo scegliere come serializzare, indipendentemente dal modo (nodi ed attributi), beh…non ho molti dubbi su cosa scegliere (anche se non vi nascondo che voglio fare ancora qualche test, magari con un grafo più complesso)

viceversa se voglio che il mio xml abbia una struttura ben precisa (magari che rispecchi uno Schema XSD) beh devo adattare il mio sviluppo e le mie classi all’utilizzo con XmlSerializer perchè è lui la scelta migliore

Se non mi preoccupano ne prestazioni ne schema, sceglierei (personalmente) DataContractSerializer perchè le decorazioni necessarie rendono più chiaro, per chi guarda le nostre classi, cosa intendiamo esporre

 

sperando come sempre di essere stato utile a qualcuno attendo eventuali vostri rimproveri o suggerimenti

E.

Posted da Nezumi | 5 comment(s)
Inserito sotto: ,

Non so nei vostri uffici o abitazioni se è accaduto lo stesso…ma quando qui da me hanno scoperto il logo di google interattivo dell’altro giorno si è bloccato tutto l’openspace per una ventina di minuti…per chi se lo fosse perso http://macek.github.com/google_pacman/

di tanto in tanto fa bene staccare la spina

Posted da Nezumi | con no comments
Inserito sotto: ,

Available to this address the newest version of the Enterprise Library. Among the updates, the most interesting (imm&ho):

  • Asynchronous data access support
  • Optimized cache scavenging
  • Support for the .NET 4.0 Framework and integration with Microsoft Visual Studio 2010
  • Integration with Windows Presentation Foundation (WPF) validation mechanisms
  • Major architectural refactoring that provides improved testability and maintainability through full support of the dependency injection style of development

while other features are:

  • Dependency injection container independence (Unity ships with Enterprise Library, but you can replace it with a container of your choice)
  • Programmatic configuration support, including a fluent configuration interface and an XSD schema to enable IntelliSense
  • Redesign of the configuration tool to provide:
    • A more usable and intuitive look and feel
    • Extensibility improvements through meta-data driven configuration visualizations that replace the requirement to write design time code
    • A wizard framework that can help to simplify complex configuration tasks
  • Data accessors for more intuitive processing of data query results
  • Honoring validation attributes between Validation Application Block and DataAnnotations
  • Support for complex configuration scenarios, including additive merge from multiple configuration sources and hierarchical merge
  • Better performance when logging
  • A reduction of the number of assemblies
  • Support for the .NET 4.0 Framework and integration with Microsoft Visual Studio 2010
  • Improvements to Unity

 

If you don't know the Enterprise Library: we are talking about a group of libraries that abstract operations performed daily by almost developers in the world, for example DataAccess, Logging, Validation, Dependency Injection, Unit Test

Scenario: sono stanco di farmi filtri sul registro degli eventi per avere i messaggi (d’errore, di warning, di info…… a seconda del trace level) che riguardano la mia applicazione, oggi faccio i capricci come i bambini, e voglio un EventSource tutto per me

Semplice da realizzare, e forse non è nemmeno da considerare un capriccio,perchè effettivamente scrivere nell’eventlog in un’area riservata solo a me mi da la possibilità di distinguere facilmente poi eventuali errori in maniera più efficiente e senza dover ricorrere a dei filtri, che poi dovrò esportare ed importare, quando passerò dall’ambiente di sviluppo a quello di test, e mi toccherà rifarlo quando passerò da test a produzione (no vi prego, io al massimo voglio fare click su “publish” per andare in produzione)

il codice che potete usare per testare il tutto è:

EventSourceCreationData source = new EventSourceCreationData("test", "testLogFile");
if (!EventLog.Exists("testLogFile"))
     EventLog.CreateEventSource(source);

EventInstance inst = new EventInstance(20, 1, EventLogEntryType.Error);
EventLog.WriteEvent("test", inst, "messaggio da loggare");

//e qui il codice per pulire se non vogliamo lasciare nessuna traccia del nostro log

Debugger.Break();
if (EventLog.SourceExists("test"))
    EventLog.DeleteEventSource("test");

if (EventLog.Exists("testLogFile"))
    EventLog.Delete("testLogFile");

eventsource di test

 

A questo punto (in verità l’avrei già detto almeno 20 righe fa) perché dovrei scegliere di loggare in questo modo e non usare log4net…e farlo in altri modi: su un file di log, o su un db…o tanti altri modi. Vi risponderò parafrasando un noto personaggio…”LA RISPOSTA E’…NON LO SO”, nel senso che ci sono realtà in cui magari non è permesso l’uso di librerie sviluppate dall’esterno, o situazioni che richiedono una soluzione ad alta personalizzazione, insomma…ci sono svariati motivi per scegliere di loggare così, e come sempre condivisibili o meno

 

 

E.

Microsoft ha rilasciato il “Windows MultiPoint Mouse Software Development Kit (SDK)”, che in parole povere permette l’interazione di una vostra applicazione con più mouse contemporaneamente

 

Questo è il link per il download

 

Mentre a questo indirizzo trovate gli esempi di utilizzo di questa tecnologia (tra cui microsoft mouse mischief di cui ha parlato Antonio qualche giorno fa sul suo blog)

 

Sul sito si parla di un utilizzo in ambito didattico, che a pensarci bene è cosa buona e giusta, ma, sarà perché ultimamente penso spesso alla creazione di un gioco (e sono sempre più convinto che non sia cosa da poco, anzi…non avrò mai il tempo di farlo per davvero), a me è venuto subito in mente la possibilità di creare un “quiz da salotto” del tipo che il giocatore che clicca per primo sulla risposta esatta vince

Ma indubbiamente gli scenari di utilizzo sono molteplici, anzi mi interesserebbe conoscere il punto di vista di chi leggerà questo post, e dei possibili utilizzi che farebbe (non vale leggere l’articolo ufficiale e poi rispondere) :)

 

Saluti.

E.

Posted da Nezumi | con no comments
Inserito sotto: , ,

All’indirizzo http://downloads.red-gate.com/ebooks/DotNet/NET_Perf_and_Test_eBook.zip potrete trovare un ebook (gratuito)

questi i capitoli presenti:

  • Chapter 01: Introduction - The What and the Why
  • Chapter 02: Understanding Performance Targets
  • Chapter 03: Performance and Load Test Metrics
  • Chapter 04: Implementing your Test Rig
  • Chapter 05: Creating Performance Tests
  • Chapter 06: Next Steps - Profiling
  • Chapter 07: Performance Profiling
  • Chapter 08: Memory Profiling
  • Chapter 09: The Performance Testing Process
  • Chapter 10: Common Areas for Performance Improvement
  • Chapter 11: Load Balancing
  • Chapter 12: Internet Information Server (IIS)
  • Chapter 13: HTTP Optimization

io ho soltanto iniziato la lettura delle prime pagine, e mi sembra piuttosto semplice, purtroppo non ho abbastanza tempo per leggerlo e darvi un parere completo entro breve tempo, ma penso che possa valere la pena di dedicargli un minimo di attenzione ;)

 

E.

Posted da Nezumi | 1 comment(s)
Inserito sotto: , ,

Che dire, l’argomento è tutt’altro che ostico, anzi appena mi è balenata l’idea di postare su questo argomento, mi sono subito risposto <<ma a che pro? lo sanno anche i sassi>> e poi ho pensato :<<Beh però quando hai iniziato a fare applicazioni .Net nemmeno tu lo sapevi, su posta per chi ha appena iniziato>> e quindi eccomi qui :)

Dopo questa interessantissima prefazione passiamo ai fatti

  • Scenario
    • Mi trovo a voler aggiungere sezioni di configurazione personalizzate al file di configurazione che mi sia possibile recuperare a runtime

 

  • Soluzione
    • Aggiungo al file di configurazione (se non è già presente) la sezione (scusate il gioco di parole)
      • <configSections>
         
        </configSections>
      •  

    • Ci creo dentro un gruppo di sezioni
      •  
        • <sectionGroup name="OpenSourceFactory.MyApplication">
        • </sectionGroup>

    • A questo punto dentro sectionGroup dobbiamo metterci qualcosa e cosa?
      • <section name=”ConfigFiles” type=”System.Configuration.NameValueSectionHandler”/>

 

  •  
    • Ora la section è stata aggiunta al file di configurazione, di conseguenza il parser non mi darà nessun errore se scrivo questo
      •   <OpenSourceFactory.MyApplication>
            <ConfigFiles>
              <add key="DefaultConfigPath" value="C:\MyApplication\config\default.xml" />
            </ConfigFiles> 
        </OpenSourceFactory.MyApplication>

 

  •  
    • ed ora i passi per accedere al file di configurazione
      • prima di tutto aggiungete al vostro progetto un riferimento a “System.Configuration”
      • NameValueCollection colSet = ConfigurationManager.GetSection("OpenSourceFactory.MyApplication/ConfigFiles") as NameValueCollection;
      • risolvete ConfigurationManager se non lo avete già fatto
      • string path = colSet["DefaultConfigPath"];

 

Sperando di essere stato utile a qualcuno, vi saluto fino al prossimo post.

E.

Posted da Nezumi | con no comments
Inserito sotto: , ,

Oggi stavo personalizzando un pò la configurazione del mio nuovo portatile quando entro nelle impostazioni del touchpad e sotto scopro questo button:

ma cosa dice 

ma che farà?

 

E.

Posted da Nezumi | con no comments

The new Release of WPF toolkit (dated Feb 22 2010) contains, over various bugfix, 3 new controls

  • AutoCompleteBox
    • => Represents a control that provides a text box for user input and a drop-down that contains possible matches based on the input in the textbox.
  • Accordion
    • => Represents a collection of collapsed and expanded AccordionItem controls
  • Rating
    • => The rating control used for user feedback (or something else)

 

 

E.

Posted da Nezumi | con no comments
Inserito sotto: , ,

Ormai sono anni che mi registro un pò ovunque, su internet, ed ogni volta noto sempre la stessa cosa, mi si chiede il CAP e poi mi si chiede Comune e Provincia

Ma è così difficile ragionare sull’inutilità di questi dati?o meglio sulla loro ridondanza??

Il CAP di suo si porta dietro informazioni su Comune e Provincia e in alcuni casi anche sul quartiere

 

Pensateci gente…pensateci!!!

Emanuele

Posted da Nezumi | con no comments
Inserito sotto: ,

 

singleton

everyone knows the implementation of singleton pattern, nothing new under the sun:

  1. private instance
  2. private constructor
  3. public method that controls if the instance is null (in this case initialize it),and returns the instance

the code will be similar to this

public Singleton

{

private Singleton instance = null;

private Singleton() { }

public Singleton GetIstance()

{

       if (instance == null)

              instance = new Singleton();

       return instance;

}

}

Well I learned,with my regret, that this kind of approach is not thread-safe,ie: in multi-threaded environment, two threads simultaneously ask an instance, and the operating system runs the context-switch, just after the if, and so before you make a new, then I’ll have two instances, of which only one is valid (the second)

The first solution that everyone uses is:

public sealed class Singleton
    {
        private static volatile Singleton _instance = null;
        private Singleton() { }

        public static Singleton GetIstance()
        {
            if (_instance == null)
            {
                lock(typeof(Singleton))
                {
                    if (_instance == null)
                    {
                        _instance = new Singleton();
                    }
                }
            }
            return _instance;
        }
    }

Essentially,in the worst case of context-switch before the new, (in this case possible only before the lock), we check by the second if that the first thread receives the instance created by the second thread.

 

Beautiful…... but unwatchable!!! I have to check in two consecutive times, the same condition. Operation that will not be optimized at compile time, because of the little word "volatile" ( topic of other posts if it is the case) in declaration of the static instance .

Can appear that this is the right direction to follow, for the concept "I want something robust, so it will be increasingly difficult" ,but the easiest solution is this:

public sealed class Singleton

{

public static readonly Singleton = new Singleton();

private Singleton() { }

}

Because the initialization of static members are thread-safe in .Net Framework

 

See you soon

Posted da Nezumi | con no comments
Inserito sotto:

As i don’t like a car that i can’t open to look at the engine compartment, so i don’t like to develop without seeing what’s happening behind the code.

While I’m looking for a good documentation about .net Framework, i found this software from Red-Gate (needs registration before download)

reflector

as you can see this is the code inside List<T>.Sort method.

I hope that this post helps someone to improve the study of .Net Framework

see you soon

E.

Posted da Nezumi | 1 comment(s)
Inserito sotto: ,

Sometimes may occur that you need to use the construct SWITCH-CASE in a Formula Field.

Well, the syntax is really simple:

Switch( condition, what_output, condition, what_output….)

for example

Switch ([customer.sex] = “Male”, “You are Welcome”, [customer.sex] = “Female”, “You are VERY Welcome”) :)

nothing more,nothing less

 

E.

Posted da Nezumi | 3 comment(s)
Inserito sotto:

Alcune volte può capitare che abbiate bisogno di vedere quali elementi di una collezione non siano inclusi in un’altra collezione.  (NOT IN)

Per esempio: Il classico libretto universitario

  • ho una lista di esami da sostenere per quanto riguarda il mio corso di laurea
  • ho una lista di esami che ho già sostenuto
  • voglio la lista degli esami da sostenere

il risultato in codice

IList<Esame> esami = InQualcheModoRecuperoTuttiGliEsamiDelMioCorsoDiLaurea(); :-)

IList<Esame> esamiSostenuti = InQualcheModoRecuperoTuttiGliEsamiSostenuti();

var esamiDaSostenere = from r in esami
where esamiSostenuti.All(m => m.Id != r.Id)
select r;

et voilà! :-) ho escluso dalla lista, di tutti gli esami, quelli che ho sostenuto

ps: Ovviamente nel mio caso ho previsto che gli esami fossero identificati da un id

pps: Mi scuso per l’indentazione

Posted da Nezumi | 2 comment(s)
Inserito sotto:

Da quando lavoro con WPF ho riscontrato notevoli problemi nell’utilizzo tool per la grafica di Visual Studio, in particolar modo, ho notato quanto sia lento questo strumento rispetto all’utilizzo di Blend.

Poi dopo aver creato una certa quantità di “form”, con WPF, si inizia a voler avere maggior controllo sul comportamento di ogni singolo componente, e si iniziano a scrivere tag “a manina” col solo ausilio dell’intellisense, e a questo punto, se la parte grafica la gestisco con Blend, ho iniziato a scrivere tag da solo, e allora che senso ha continuare ad avere quegli inutili rallentamenti in VS quando cerco di caricare uno xaml?

Proprio per questo vi propongo un tip molto interessante,e a quanto pare anche molto diffuso tra chi usa WPF (o xaml in generale), la disabilitazione dell’editor grafico di VS, che si ottiene mediante i seguenti passi:

  • menù Strumenti –> Opzioni –> Editor di Testo –> XAML –> Varie –> checkare “Apri sempre documento in visualizzazione XAML completa”

per la versione inglese

  • Tools –> Options –> Text Editor –> XAML –> Miscellaneous –> check “Always open documents in full XAML View

 

sperando di esservi stato utile
Vi saluto

 

Emanuele

Posted da Nezumi | con no comments
Inserito sotto:
Più Post Pagina seguente »