C# 如何最好地表达序列化/反序列化类型的扩展方法

C# 如何最好地表达序列化/反序列化类型的扩展方法,c#,serialization,extension-methods,C#,Serialization,Extension Methods,我有以下两种扩展方法: public static object DeserializeFromXmlFile(this Type type, string FileName) { try { using (TextReader reader = new StreamReader(FileName)) { XmlSerializer ser = new XmlSerializer(ty

我有以下两种扩展方法:

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
如何使用反序列化方法,我能不能让它像序列化用法一样好(在
SaveToFile()
中)?

我不确定
类型的扩展方法是否适合这里。您并不是在真正“扩展”
类型
类。您可以将其改为通用:

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?
    }
}
public static T反序列化fromXmlFile(字符串文件名),其中T:class
{
尝试
{
使用(TextReader=new StreamReader(文件名))
{
XmlSerializer ser=新的XmlSerializer(typeof(T));
将序列反序列化(读取器)返回为T;
}
}
捕获(例外情况除外)
{
返回默认值(T);//这真的是正确的方法吗?忽略错误并静默返回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 LoadFromFile(字符串日志文件)
{
返回反序列化的xmlfile.(日志文件);
//或者返回{classname}.DeserializeFromXmlFile.(日志文件);
//如果静态方法是在其他类中定义的。
}

请注意,您必须在调用中包含
,因为编译器可以;t使用返回类型推断泛型类型参数

您只需要简化接口并使两个调用的签名相同。这将导致更清晰的代码

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;
    }
}

谢谢,泛型使语法看起来更好。至于静默返回,为了简单起见,我删去了日志和报告。谢谢。仿制药太棒了!不太好。“MyClass LoadFromFile(string LogFile,MyClass c)”或类似函数是反序列化各种类所必需的。