I am attempting to serialize a List<Vehicle>
of derived classes. I have an abstract class Vehicle
which several classes extends.
The Vehicle
class looks like this:
[Serializable]
[XmlInclude(typeof(HyperloopTrain))]
[XmlInclude(typeof(Tesla))]
[XmlInclude(typeof(FalconHeavyRocket))]
public abstract class Vehicle : IComparable
{
protected string name;
protected float maxSpeedInKmPerHour;
protected float weightInKg;
protected float priceInDkk;
public int CompareTo(object obj)
{
if (obj == null) return 1;
Vehicle otherVehicle = obj as Vehicle;
if(otherVehicle != null)
{
return this.name.CompareTo(otherVehicle.name);
} else {
throw new ArgumentException("Object is not a vehicle");
}
}
}
And the Program
where they are supposed to get serialized:
class Program
{
static void Main(string[] args)
{
var program = new Program();
var instances = InstanceService<Vehicle>.GetInstances();
program.SaveToDisk(instances);
}
private void PrintVehicles(IEnumerable<Vehicle> data)
{
List<Vehicle> vehicles = data.ToList();
vehicles.Sort();
foreach(var vehicle in vehicles)
{
Console.WriteLine(vehicle.ToString());
}
}
private void SaveToDisk(IEnumerable<Vehicle> data)
{
List<Vehicle> vehicles = data.ToList<Vehicle>();
SerializeObject<IEnumerable<Vehicle>>(vehicles, "vehicles.xml");
Console.WriteLine("vehicles saved");
}
public void SerializeObject<T>(T serializableObject, string fileName)
{
if (serializableObject == null) { return; }
try
{
XmlDocument xmlDocument = new XmlDocument();
XmlSerializer serializer = new XmlSerializer(serializableObject.GetType());
using (MemoryStream stream = new MemoryStream())
{
serializer.Serialize(stream, serializableObject);
stream.Position = 0;
Console.WriteLine(stream.Position);
xmlDocument.Load(stream);
xmlDocument.Save(fileName);
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
throw;
}
}
}
The code does not return any errors whatsoever, but does not create a file either (atleast not that I am aware of, what is the default save location?).