2009-02-02 8 views
0

Mon application reçoit des chaînes représentant des objets. Je dois analyser les chaînes pour obtenir les valeurs de propriété pour l'objet que je crée. Chaque objet devra connaître les détails sur le nombre d'attributs, ce que chaque attribut signifie, etc. Cependant, je veux éviter que chaque classe sache comment analyser la chaîne. Je préfère passer à chaque objet une structure de données plus appropriée (comme un ensemble de données ou XML) ... quelque chose de plus facile à remplir avec ses propriétés.Comment désérialiser ces données de chaîne?

Y a-t-il quelque chose de intégré au framework .NET qui soit adapté à ce type de chose? Ou devrais-je créer mon propre objet conteneur?

ADD:

Je ne pense pas que je l'ai expliqué ma question assez bien au départ. Voici un exemple à clarifier. Disons que mon programme est toujours passé une chaîne de caractères qui représente une table de données dans la syntaxe Wiki. Quelque chose comme:

{||Client:||ABC|-|Contact:||Joe Smith|-|Current revision:||1.0||} 

Je ne veux pas chacun de mes objets de table wiki spécifique (par exemple, ClientContactTable, CustomerOrderTable, etc.) pour savoir comment analyser out | et et }. Donc, je voudrais écrire 1 morceau de code qui analyse la chaîne dans un objet de niveau «intermédiaire» que je peux transmettre au constructeur de chaque objet de table Wiki spécifique.

Ma question est: quel devrait être cet objet de niveau intermédiaire?

Répondre

3

je pourrais avoir compris votre question à tort, mais je pense que la sérialisation .NET standard convient à vos besoins:

var ms = new MemoryStream(); 
var formatter = new BinaryFormatter(); 
formatter.Serialize(ms, myObject); 

// Deserialization: 
var deserialized = (MyClass)formatter.Deserialize(stream); 
+0

Qu'en est-il de la liste propriétés dans l'objet? – Kiquenet

0
vous

besoin d'analyser les données de chaîne et le convertir en un objet ou xml - je suggère que vous utilisez string.split à Créez une collection (tableau) puis utilisez linq pour créer la structure de données que vous voulez et passez à une usine qui vous renvoie l'objet correct en fonction du paramètre que vous passez à la facotry avec la structure de données.

1

Une façon traditionnelle de le faire est à travers les classes System.Xml.Serialization. Cela vous permet de sérialiser vos objets sur le disque et de les désérialiser plus tard. Cela vient avec quelques restrictions: les types devraient être publics, avoir un constructeur public sans paramètre, et avoir l'attribut XmlSerializer dessus.

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 
using System.Xml.Serialization; 


namespace ConsoleApplication1 
{ 
    [Serializable] 
    public class Cat 
    { 
     DateTime _dateOfBirth; 
     string _name; 

     public DateTime DateOfBirth 
     { 
      get { return _dateOfBirth; } 
      set { _dateOfBirth = value; } 
     } 

     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 

     public Cat() : this(DateTime.Now, "(Cat with no name)") { } 

     public Cat(DateTime dateOfBirth, string name) 
     { 
      this.DateOfBirth = dateOfBirth; 
      this.Name = name; 
     } 

     public override string ToString() 
     { 
      return string.Format("Name: {0}, DateOfBirth: {1}", Name, DateOfBirth); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      Cat originalCat = new Cat(DateTime.Now, "Fluffy"); 
      XmlSerializer serializer = new XmlSerializer(typeof(Cat)); 

      MemoryStream memStream = new MemoryStream(); // can be file stream 
      serializer.Serialize(memStream, originalCat); 

      memStream.Position = 0; // this is just here to make this code sample work, usually you 
            // you don't need to set your streams position manually 

      Cat deserializedCat = (Cat)serializer.Deserialize(memStream); 

      Console.WriteLine("originalCat.ToString(): {0}", originalCat.ToString()); 
      Console.WriteLine("deserializedCat.ToString(): {0}", deserializedCat.ToString()); 

      Console.ReadKey(true); 
     } 
    } 
} 

En général, vous devriez être très prudent avec ce genre de sérialisation. L'étrangeté se produit lorsque vous essayez de sérialiser/désérialiser des objets entre différentes versions du même assemblage.

Modifier pour ajouter: Le code ci-dessus sérialisera votre objet en XML. Vous pouvez voir la représentation XML en remplaçant votre MemoryString par un StringWriter à la place (appelez la méthode stringWriterInstance.ToString() pour obtenir la chaîne XML directement).D'autres ont suggéré d'utiliser le BinaryFormatter, qui fait plus ou moins la même chose, mais la sortie est binaire plutôt que du texte. Les deux approches sont des moyens valides pour sérialiser les données, cela dépend si vous aimez traiter davantage avec des données XML ou binaires.

0

Si vous avez besoin de stocker vos objets, vous devez utiliser XmlSerializer (s). Cela va de/sérialiser vos objets en XML et les analyser pour vous.

public List<_type> LoadDataFromResource<_type>(string file) 
{ 
    List<_type> data = new List<_type>(); 
    FileStream str = File.OpenRead(file); 
    if (str == null) return null; 
    XmlSerializer sr = new XmlSerializer(data.GetType()); 
    if (sr == null) return null; 
    data = sr.Deserialize(str) as List<_type>; 
    return data; 
} 

public bool SaveData<_type>(string file, List<_type> data) 
{ 
StreamWriter writer = File.CreateText(file); 
if (writer == null) return false; 
XmlSerializer sr = new XmlSerializer(data.GetType()); 
if (sr == null) return false; 
sr.Serialize(writer, data); 
return true; 
} 
Questions connexes