307 messaggi dal 13 luglio 2005
Ciao a tutti,
dovrei serializzare e deserializzare una classe (ovvero una tabella di un DB) che si trova in un Entity Model. Come se non bastasse dovrei cambiare nome ai vari campi utilizzando l'attributo:
[System.Xml.Serialization.XmlElement("NuovoNome")]

Come si puo' fare tutto cio'? Qualcuno mi sa dare una mano?

Vi ringrazio e vi saluto.

Umb
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
dopo aver ottenuto le entità dal database, puoi serializzarle con la classe XmlSerializer. Qui c'è un esempio:
http://www.jonasjohn.de/snippets/csharp/xmlserializer-example.htm

Attenzione perché se la tua entità contengono delle proprietà di navigazione potresti incappare in riferimenti ciclici, dato che il serializzatore proverà a percorrere tutto il grafo di oggetti. Forse ti conviene inviare la query LINQ dopo aver disabilitato il lazy loading e la generazione di proxy. Usa l'Include per decidere quali entità correlate caricare affinché siano serializzate anch'esse.
List<Prodotto> prodotti;
using (var ctx = new MyDbContext()){
  ctx.Configuration.ProxyCreationEnabled = false;
  ctx.Configurazion.LazyLoadingEnabled = false;
  prodotti = ctx.Prodotti.Include(p => p.Categorie).ToList();
}
//Qui serializzi l'array di prodotti con l' XmlSerializer


ciao,
Moreno
Modificato da BrightSoul il 04 ottobre 2016 21.53 -

Enjoy learning and just keep making
307 messaggi dal 13 luglio 2005
Ciao Moreno,
ti ringrazio per la risposta, ma forse sono stato poco chiaro ...
Il mio problema non e' tanto serializzare una classe, quanto il fatto che questa classe e' stata creata automaticamente da Entity Framework e quindi non posso modificarla ne', tantomeno, aggiungere attributi alle properties.

Ti faccio un esempio. Supponiamo che io abbia la tabella "Prodotti" nel mio database. Creo un Entity Model e col comando "Aggiorna modello da database...", aggiungo la mia tabella.
A questo punto si creera' la classe:
//------------------------------------------------------------------------------
// <auto-generated>
//     Codice generato da un modello.
//
//     Le modifiche manuali a questo file potrebbero causare un comportamento imprevisto dell'applicazione.
//     Se il codice viene rigenerato, le modifiche manuali al file verranno sovrascritte.
// </auto-generated>
//------------------------------------------------------------------------------

namespace MioNameSpace
{
    using System;
    using System.Collections.Generic;
    
    public partial class Prodotti
    {
        public int IDProdotto { get; set; }
        public string CodProdotto { get; set; }
        public string DescrizioneProdotto { get; set; }
    }
}


Supponiamo ora che io debba serializzare la mia classe, ma debba dare dei nomi diversi ai campi, per esempio:
IDProdotto -> IDProduct
CodProdotto -> Codice
DescrizioneProdotto -> Nome

Normalmente questa operazione si fa, che io sappia, aggiungendo ad ogni property da modificare, l'attributo:

[System.Xml.Serialization.XmlElement("NuovoNome")]

nel mio caso, e non potendo modicare la classe, come posso ottenere questo risultato?

Spero di essere stato piu' chiaro.

Grazie e a presto (spero).

Umb
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
leggi questo, ti mostra come usare gli XmlAttributeOverrides.
http://www.ikriv.com/dev/dotnet/OverrideXml.shtml

L'alternativa (magari per il prossimo progetto) sarebbe quella di usare l'approccio code-first di Entity Framework che ti dà il controllo completo sulle tue classi (non vengono autogenerate). In questo modo avresti potuto porre su di esse gli attributi che hai citato.

ciao,
Moreno

Enjoy learning and just keep making
307 messaggi dal 13 luglio 2005
Ciao Moreno,
WOW funziona!! E' un po' troppo "macchinoso", ma ... funziona!

Visto che sono ancora in tempo proverò anche la carta del creare prima le classi e poi da quelle il database.

Comunque mi sei stato di grande aiuto, Moreno. Ti ringrazio.

Ciao.

Umb

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.