Reputation: 2183
I have a method which I want to generalize. I want to use following Deserialize function for any object type, as belew:
ExportDefinition _expDefinition = new ExportDefinition("a.ini");
DeliveryDefinition _delDefinition = new DeliveryDefinition("b.ini");
ExportDefinition expDef = Deserialize(_expDefinition);
DeliveryDefinition devDef = Deserialize(_delDefinition);
public SomeType Deserialize(SomeType?? tp) // What should I use instead of SomeType?
{
try
{
FileStream readFileStream = new FileStream(definitionFile, FileMode.Open, FileAccess.Read, FileShare.Read);
XmlSerializer serializerObj = new XmlSerializer(typeof(tp));
tp loadedObj = (tp)serializerObj.Deserialize(readFileStream);
readFileStream.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return loadedObj;
}
Any ideas, how to achieve this?
Upvotes: 1
Views: 143
Reputation: 49005
Use generics:
public T Deserialize<T>(string filePath)
{
Stream stream = null;
try
{
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
XmlSerializer serializerObj = new XmlSerializer(typeof(T));
return (T)serializerObj.Deserialize(stream);
}
catch (Exception)
{
throw;
}
finally
{
if (stream != null)
{
stream.Close();
}
}
}
The non-generic version based on the useful comment of Marc Gravell:
public object Deserialize(string filePath, Type type)
{
Stream stream = null;
try
{
stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
XmlSerializer serializerObj = new XmlSerializer(type);
return serializerObj.Deserialize(stream);
}
catch (Exception)
{
// Put something useful here
throw;
}
finally
{
if (stream != null)
{
stream.Close();
}
}
}
Upvotes: 6