Comment faire une classe sérialisable qui contient une instance d'une classe à partir d'un ensemble de classes
.Net 4 ou 4.5, comment voulez-vous concevoir une classe sérialisable qui contient une instance d'une classe à partir d'un ensemble de classes? Par exemple, supposons que j'ai un Garage de classe, qui peut contenir une instance de "véhicule" des classes de type, disons Voiture, Bateau, Moto, camping-car. Mais le Garage ne peut contenir qu'une instance de l'une de ces classes. J'ai essayé quelques façons différentes de le faire, mais mon problème est de faire serializable.
Ici est un premier exemple où il n'y a qu'une seule option pour l'instance dans le Garage de la classe. Vous devriez être en mesure de le brancher à droite dans une nouvelle application de console et de l'essayer.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace Patterns
{
[Serializable()]
public class Garage
{
private Vehicle _MyVehicle;
public Garage()
{
}
public string GarageOwner { get; set; }
public Vehicle MyVehicle
{
get { return _MyVehicle; }
set { _MyVehicle = value; }
}
}
[Serializable()]
public class Vehicle
{
public string VehicleType { get; set; }
public int VehicleNumber { get; set; }
}
class Serializer
{
static string _StartupPath = @"C:\Projects\Patterns\Data\";
static string _StartupFile = "SerializerTest.xml";
static string _StartupXML = _StartupPath + _StartupFile;
static void Main(string[] args)
{
Console.Write("Press w for write. Press r for read:");
ConsoleKeyInfo cki = Console.ReadKey(true);
Console.WriteLine("Pressed: " + cki.KeyChar.ToString());
if (cki.KeyChar.ToString() == "w")
{
Garage MyGarage = new Garage();
MyGarage.GarageOwner = "John";
MyGarage.MyVehicle = new Vehicle();
MyGarage.MyVehicle.VehicleType = "Car";
MyGarage.MyVehicle.VehicleNumber = 1234;
WriteGarageXML(MyGarage);
Console.WriteLine("Serialized");
}
else if (cki.KeyChar.ToString() == "r")
{
Garage MyGarage = ReadGarageXML();
Console.WriteLine("Deserialized Garage owned by " + MyGarage.GarageOwner);
}
Console.ReadKey();
}
public static void WriteGarageXML(Garage pInstance)
{
XmlSerializer writer = new XmlSerializer(typeof(Garage));
using (FileStream file = File.OpenWrite(_StartupXML))
{
writer.Serialize(file, pInstance);
}
}
public static Garage ReadGarageXML()
{
XmlSerializer reader = new XmlSerializer(typeof(Garage));
using (FileStream input = File.OpenRead(_StartupXML))
{
return reader.Deserialize(input) as Garage;
}
}
}
}
OriginalL'auteur John | 2013-01-14
Vous devez vous connecter pour publier un commentaire.
Basé sur un autre DONC, l'article, c'est ce qui a finalement fonctionné pour moi.
Il peut sérialiser et désérialiser proprement. À l'aide de cet exemple, je peux concevoir un "arbre" des objets qui ont des options pour ce qui est utilisé. Donc, cela pourrait être prolongé qu'une Voiture peut avoir un Moteur de plusieurs Moteurs différents type de classes et une à l'Intérieur de différents types d'Intérieur... et ainsi de suite.
Le code a commencé à travailler en ajoutant les instructions ci-dessous comme: [XmlInclude(typeof(Voiture))]
Mais s'il vous plaît laissez-moi savoir si il ya de meilleures façons!
OriginalL'auteur John
Pour sérialiser des séquences de classes sérialisables vous pouvez utiliser la liste Générique des instances.
J'ai généré ce
Simplement en convertissant le MyVehicle à une liste générique
OriginalL'auteur Eric Herlitz