如何最好地表达这种用于序列化/反序列化类型的扩展方法
How to best express this extension method for serializing / deserializing types
我有以下两种扩展方法:
public static object DeserializeFromXmlFile(this Type type, string FileName)
{
try
{
using (TextReader reader = new StreamReader(FileName))
{
XmlSerializer ser = new XmlSerializer(type);
return ser.Deserialize(reader);
}
}
catch (Exception ex)
{
return null;
}
}
public static bool SerializeToXmlFile(this object obj, string FileName)
{
try
{
using (TextWriter writer = new StreamWriter(FileName))
{
XmlSerializer ser = new XmlSerializer(obj.GetType());
ser.Serialize(writer, obj);
}
return true;
}
catch (Exception ex)
{
return false;
}
}
然后是使用它们的代码:
SaveToFile(string LogFile, MyClass c)
{
c.SerializeToXmlFile(LogFile);
}
MyClass LoadFromFile(string LogFile)
{
return (MyClass)typeof(MyClass).(LogFile);
}
我不喜欢 LoadFromFile
使用 Deserialize 方法的方式,我可以让它像 Serialize 用法一样好(在 SaveToFile()
中)吗?
我不确定 Type
的扩展方法是否适用于此处。你不是真正的 "extending" Type
class。您可以改为通用:
public static T DeserializeFromXmlFile<T>(string FileName) where T:class
{
try
{
using (TextReader reader = new StreamReader(FileName))
{
XmlSerializer ser = new XmlSerializer(typeof(T));
return ser.Deserialize(reader) as T;
}
}
catch (Exception ex)
{
return default(T); // is this really the right approach? Just ignore the error and silently return null?
}
}
那么用法就是
MyClass LoadFromFile(string LogFile)
{
return DeserializeFromXmlFile<MyClass>.(LogFile);
// or return {classname}.DeserializeFromXmlFile<MyClass>.(LogFile);
// if the static method is defined in a different class.
}
请注意,您必须在调用中包含 <MyClass>
,因为编译器无法使用 return 类型推断通用类型参数。
你只需要简化界面,使两个调用的签名相同即可。这将使代码更加清晰。
MyClass LoadFromFile(string LogFile, MyClass c)
{
return (MyClass) c.DeserializeFromXmlFile(LogFile);
}
并获取执行必要烟花的方法而不是调用者。
public static object DeserializeFromXmlFile(this object obj, string FileName)
{
try
{
using (TextReader reader = new StreamReader(FileName))
{
XmlSerializer ser = new XmlSerializer(obj.GetType());
return ser.Deserialize(reader);
}
}
catch (Exception ex)
{
return null;
}
}
我有以下两种扩展方法:
public static object DeserializeFromXmlFile(this Type type, string FileName)
{
try
{
using (TextReader reader = new StreamReader(FileName))
{
XmlSerializer ser = new XmlSerializer(type);
return ser.Deserialize(reader);
}
}
catch (Exception ex)
{
return null;
}
}
public static bool SerializeToXmlFile(this object obj, string FileName)
{
try
{
using (TextWriter writer = new StreamWriter(FileName))
{
XmlSerializer ser = new XmlSerializer(obj.GetType());
ser.Serialize(writer, obj);
}
return true;
}
catch (Exception ex)
{
return false;
}
}
然后是使用它们的代码:
SaveToFile(string LogFile, MyClass c)
{
c.SerializeToXmlFile(LogFile);
}
MyClass LoadFromFile(string LogFile)
{
return (MyClass)typeof(MyClass).(LogFile);
}
我不喜欢 LoadFromFile
使用 Deserialize 方法的方式,我可以让它像 Serialize 用法一样好(在 SaveToFile()
中)吗?
我不确定 Type
的扩展方法是否适用于此处。你不是真正的 "extending" Type
class。您可以改为通用:
public static T DeserializeFromXmlFile<T>(string FileName) where T:class
{
try
{
using (TextReader reader = new StreamReader(FileName))
{
XmlSerializer ser = new XmlSerializer(typeof(T));
return ser.Deserialize(reader) as T;
}
}
catch (Exception ex)
{
return default(T); // is this really the right approach? Just ignore the error and silently return null?
}
}
那么用法就是
MyClass LoadFromFile(string LogFile)
{
return DeserializeFromXmlFile<MyClass>.(LogFile);
// or return {classname}.DeserializeFromXmlFile<MyClass>.(LogFile);
// if the static method is defined in a different class.
}
请注意,您必须在调用中包含 <MyClass>
,因为编译器无法使用 return 类型推断通用类型参数。
你只需要简化界面,使两个调用的签名相同即可。这将使代码更加清晰。
MyClass LoadFromFile(string LogFile, MyClass c)
{
return (MyClass) c.DeserializeFromXmlFile(LogFile);
}
并获取执行必要烟花的方法而不是调用者。
public static object DeserializeFromXmlFile(this object obj, string FileName)
{
try
{
using (TextReader reader = new StreamReader(FileName))
{
XmlSerializer ser = new XmlSerializer(obj.GetType());
return ser.Deserialize(reader);
}
}
catch (Exception ex)
{
return null;
}
}