Classe XmlSerializer problema con serializzazione List

di il
4 risposte

Classe XmlSerializer problema con serializzazione List

Con riferimento al codice esempio sottostante creo una nuova part e la associo per riferimento alle due liste della classe Brano.
L'elemento della lista AllParts punta allo stesso elemento che punta la lista Parts, quindi se modifico part (esempio part.Name="Parte modificata") mi ritrovo la modifica sia nel primo elemento della AllParts sia nel primo elemento della Parts come è giusto che sia.

Però dopo aver serializzato l'oggetto brano = new Brano(); e salvato su disco e successivamente riletto e deserializzato le due liste non puntano più agli stessi elementi ma viene creata una copia degli oggetti part per ogni lista perchè nel file xml vengono registrate separatamente le due liste e si perde quindi il riferimento allo stesso oggetto.

Per spiegarmi dopo la deserializzazione xml se modifico AllParts[0].Name = “Dopo”   Parts[0].Name rimane a “Parte 1” perchè punta ad un oggetto part diverso.

Come posso risolvere questo problema? Cioè vorrei ricreare dopo la deserializzazione la stessa struttura di partenza con le due liste che puntano agli stessi oggetti e non ai loro duplicati.

Grazie

public class Part
   {
       public string Name { get; set; }
       public int ChannelIn { get; set; }
       public int Out { get; set; }
       public int ChannelOut { get; set; }
       public int Banco_0 { get; set; }
       public int Banco_32 { get; set; }
       public int PrgChange { get; set; }
   }

   public class Brano
   {
       public List<Part> AllParts { get; set; }
       public List<Part> Parts { get; set; }
   }
       
   private void btnNuovaPart_Click(object sender, EventArgs e)
   {
        Part part = new Part();
        part.Name = “Parte1”
        brano.AllParts.Add(part);
        brano.Parts.Add(part);
    }

4 Risposte

  • Re: Classe XmlSerializer problema con serializzazione List

    Penso che l'unico modo sia creare la classe brano con la lista Parts che mantiene gli indici della Lista AllParts e una volta deserializzato ricostruire la lista public List<Part> Parts { get; set; } riassociando gli elementi di AllParts puntati da pParts.

    Avete qualche altra idea?

    public class Brano
       {
           public List<Part> AllParts { get; set; }
           public List<int> pParts { get; set; }
       }

    Grazie e buona serata

  • Re: Classe XmlSerializer problema con serializzazione List

    Usa il tag per il codice, semplifichi la vita a chi lo legge.

    Mi sfugge la necessità di avere due liste con gli stessi oggetti… Posso immaginare che in AllParts ci siano tutte le Part che appartengono al brano, ma quali di queste vanno aggiunte anche alla lista Parts?

    Immagino diverse strade come ad esempio:

    1. serializzare solo AllParts e, una volta deserializzata, ripopolare Parts
    2. aggiungere alla classe Part la proprietà che "distingue" e rendere Parts readonly con una where LINQ
  • Re: Classe XmlSerializer problema con serializzazione List

    Ho fatto in questo modo:
    La lista AllParts<Part> contiene le parti di tutto il brano, invece le liste dei preset<int> (sottinsieme delle parti di un brano) le ho fatte come List<int> di puntatori all'indice di AllParts.
    Una volta deserializzati uso preset sempre come puntatori senza ricostruire preset<Part>. O forse mi conviene ricostruire preset<Part> per velocizzare le elaborazioni dei messaggi MIDI?

    Non so cosa sia una where LINQ ????

    Grazie di tutto.

  • Re: Classe XmlSerializer problema con serializzazione List

    09/07/2024 - zorban62 ha scritto:


    Non so cosa sia una where LINQ ????

    C'è sempre Google o Chat GPT per approfondire in pochi secondi.

Devi accedere o registrarti per scrivere nel forum
4 risposte