2010-08-03 2 views
1

Voici mon code:Sérialisation en C# sans sérialisation d'une liste lorsqu'il y a un DataTable sur le côté?

[Serializable()] 
public class Project 
{ 
    private List<string> _Kinds = new List<string>(); 
    public DataTable ExtractedElementsTable; 

    public Project() 
    { 
     ExtractedElementsTable = new DataTable(); 
     ExtractedElementsTable.TableName = "Output"; 
    } 

    public List<string> Kinds 
    { 
     get { return _Kinds; } 
     set { _Kinds = value; } 
    } 
} 

Quand, après avoir ajouté des choses au List<string> _Kinds, j'essaie de sérialiser l'ensemble Poject et désérialiser puis, la liste _Kinds est vide. Mais si je commente toutes les trois lignes où ExtractedElementsTable est référencé, cela fonctionne bien. Voici est mon sérialisation et le code désérialisation (notez la ligne currentProject.Kinds.Add("hi"); dans le code de sérialisation. currentProject est juste un exemple de projet.

private void openButton_Click(object sender, EventArgs e) 
    { 
     if (openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      Stream stream = File.Open(openFileDialog1.FileName, FileMode.Open); 
      XmlSerializer xmlFormatter = new XmlSerializer(currentProject.GetType()); 
      currentProject = (Project)xmlFormatter.Deserialize(stream); 
      stream.Close(); 
     } 
    } 

    private void saveButton_Click(object sender, EventArgs e) 
    { 
     if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      currentProject.Kinds.Add("hi"); 
      Stream stream = File.Open(saveFileDialog1.FileName, FileMode.Create); 
      XmlSerializer xmlFormatter = new XmlSerializer(currentProject.GetType()); 
      xmlFormatter.Serialize(stream, currentProject); 
      stream.Close(); 
     } 
    } 
+0

Votre intention est-elle également de sérialiser la table de données, ou voulez-vous qu'elle soit omise de la sérialisation? – kbrimington

+0

Je le veux sérialisé – Juan

Répondre

1

Modifiez le champ DataTable à un champ DataSet.

J'ai couru pas mal test. les types propriété se sérialiser tous les articles. Mais ne désérialiser pas correctement. Cependant, je a changé le champ DataTable en un Dat aSet et tout a bien fonctionné.

+0

Je viens de courir à travers un article de MS qui a déclaré que la sérialisation XML de DataTable et DataRow ne fonctionne pas. Changer pour un DataSet était aussi leur réponse. –

1

sérialisation XML ne sérialise propriétés privées et les champs. Soit faire _Kind public et enlever getter et poseur, ou utiliser sérialisation binaire.

+0

la propriété Kinds sérialiser. C'est la désérialisation qui est en cause. –

+0

Juste le tester pour vous-même, si vous ne croyez pas MSDN :) – fuwaneko

+0

Je l'ai fait tester. Le résultat était que la propriété publique sérialisait la liste et que le champ public était également sérialisé. Le champ privé n'a pas été sérialisé. Lors de la désérialisation, la propriété publique ne s'est pas désérialisée. Le champ public a cependant vérifié la propriété TableName. Après avoir modifié DataTable à DataSet, les deux ont fonctionné comme prévu. –

0

Essayez ceci pour la taille. Je suis en mesure d'obtenir sérialisation valide et désérialisation avec Project conçu comme ceci:

[Serializable()] 
public class Project 
{ 
    private List<string> _Kinds = new List<string>(); 

    public Project() 
    { 
     ExtractedElementsTable = new DataTable(); 
     ExtractedElementsTable.TableName = "Output"; 
    } 

    public List<string> Kinds 
    { 
     get { return _Kinds; } 
     set { _Kinds = value; } 
    } 

    [XmlElement("ExtractedElements")] 
    public string ExtractedElementsXml 
    { 
     get 
     { 
      using (var writer = new StringWriter()) 
      { 
       this.ExtractedElementsTable.WriteXml(writer); 
       return writer.ToString(); 
      } 
     } 

     set 
     { 
      using (var reader = new StringReader(value)) 
      { 
       this.ExtractedElementsTable.ReadXml(reader); 
      } 
     } 
    } 

    [XmlIgnore] 
    public DataTable ExtractedElementsTable { get; set; } 
} 
0

Essayez de décorer votre classe comme [DataContract] puis utilisez la classe DataContractJsonSerializer sérialiser.

Vérifiez this link.

0

Pour référence ultérieure à d'autres personnes visitant ce problème ... DataTables ne peut pas être sérialisé. Cependant, les jeux de données peuvent, vous devez donc mettre votre datatable dans un ensemble de données et ensuite il peut être sérialisé.