Catel:我怎么知道 SavableModelBase.Load 何时失败?
Catel: How do I know when SavableModelBase.Load fails?
使用 Catel 4.4.0。
我让用户使用 Load(stream, XML mode) 方法浏览并加载他的数据文件,该文件是来自 SavableModelBase 子类实例(模型 ABC)的数据。该用户犯了一个错误并加载了错误的文件,该文件也是 SavableModelBase 子类但完全不同的模型(模型 XYZ)。代码经历了反序列化数据的动作,但是当然,找到了模型 ABC 的 none 属性,因此被 returned 的实例(模型 ABC)仅包含默认值属性。
我希望 Load 方法要么 return 一个空值,要么引发异常。我如何确定加载全新的模型 ABC 实例并因此真正具有默认 属性 值与意外尝试将模型 XYZ 加载为模型 ABC 之间的区别?我没有看到 SavableModelBase 的任何属性,这些属性会提醒我注意可能的混淆。
SaveableModelBase 是否有内置的东西可以帮助我确定加载错误,或者我是否需要想出某种解决方法?
如果您需要更多信息,请告诉我。谢谢!
兰迪
由于 class 可以(反)序列化多种格式(即使更改 xml 结构),没有真正的方法来查看这是否失败。在这种情况下,我会检查所需的属性 and/or 为您要以不同方式加载的每种类型使用不同的文件类型扩展名。
我决定使用自己的 Load 方法创建 SavableModelBase 的子 class。此 Load 方法将首先读取文件的根节点,该文件的名称与保存文件的 class 的名称相同。如果它们比较正常,则使用父 SavableModelBase class Load 方法恢复加载。否则,抛出异常。 (此时我忽略了二进制模式的加载。)
public class LexSavableModelBase<T> : SavableModelBase<T> where T : class
{
// SNIP!
public static new T Load(Stream stream, SerializationMode mode)
{
Argument.IsNotNull(() => stream);
if (mode == SerializationMode.Xml)
{
using (XmlReader xr = XmlReader.Create(stream))
{
xr.MoveToContent();
string rootName = xr.LocalName;
if (string.Compare(rootName, typeof(T).Name, StringComparison.OrdinalIgnoreCase) != 0)
{
throw new InvalidDataException(string.Format(CultureInfo.CurrentCulture, "Expecting data from Model [{0}], but found Model [{1}] instead.", typeof(T).Name, rootName));
}
// Reset to read from the top.
stream.Seek(0, SeekOrigin.Begin);
}
}
return SavableModelBase<T>.Load<T>(stream, mode);
}
}
我确信必须读取部分文件两次会导致性能下降,而且我所做的只是满足我的一小部分场景,但它似乎可以满足我的需要——检测何时呈现错误数据以供加载。我只在我的应用程序中的 150 多个模型中使用了大约 4 个模型。这些是客户保存到磁盘文件和从文件加载的文件。
如果你能做任何改进,请做。如果您有任何问题,请告诉我。
使用 Catel 4.4.0。
我让用户使用 Load(stream, XML mode) 方法浏览并加载他的数据文件,该文件是来自 SavableModelBase 子类实例(模型 ABC)的数据。该用户犯了一个错误并加载了错误的文件,该文件也是 SavableModelBase 子类但完全不同的模型(模型 XYZ)。代码经历了反序列化数据的动作,但是当然,找到了模型 ABC 的 none 属性,因此被 returned 的实例(模型 ABC)仅包含默认值属性。
我希望 Load 方法要么 return 一个空值,要么引发异常。我如何确定加载全新的模型 ABC 实例并因此真正具有默认 属性 值与意外尝试将模型 XYZ 加载为模型 ABC 之间的区别?我没有看到 SavableModelBase 的任何属性,这些属性会提醒我注意可能的混淆。
SaveableModelBase 是否有内置的东西可以帮助我确定加载错误,或者我是否需要想出某种解决方法?
如果您需要更多信息,请告诉我。谢谢!
兰迪
由于 class 可以(反)序列化多种格式(即使更改 xml 结构),没有真正的方法来查看这是否失败。在这种情况下,我会检查所需的属性 and/or 为您要以不同方式加载的每种类型使用不同的文件类型扩展名。
我决定使用自己的 Load 方法创建 SavableModelBase 的子 class。此 Load 方法将首先读取文件的根节点,该文件的名称与保存文件的 class 的名称相同。如果它们比较正常,则使用父 SavableModelBase class Load 方法恢复加载。否则,抛出异常。 (此时我忽略了二进制模式的加载。)
public class LexSavableModelBase<T> : SavableModelBase<T> where T : class
{
// SNIP!
public static new T Load(Stream stream, SerializationMode mode)
{
Argument.IsNotNull(() => stream);
if (mode == SerializationMode.Xml)
{
using (XmlReader xr = XmlReader.Create(stream))
{
xr.MoveToContent();
string rootName = xr.LocalName;
if (string.Compare(rootName, typeof(T).Name, StringComparison.OrdinalIgnoreCase) != 0)
{
throw new InvalidDataException(string.Format(CultureInfo.CurrentCulture, "Expecting data from Model [{0}], but found Model [{1}] instead.", typeof(T).Name, rootName));
}
// Reset to read from the top.
stream.Seek(0, SeekOrigin.Begin);
}
}
return SavableModelBase<T>.Load<T>(stream, mode);
}
}
我确信必须读取部分文件两次会导致性能下降,而且我所做的只是满足我的一小部分场景,但它似乎可以满足我的需要——检测何时呈现错误数据以供加载。我只在我的应用程序中的 150 多个模型中使用了大约 4 个模型。这些是客户保存到磁盘文件和从文件加载的文件。
如果你能做任何改进,请做。如果您有任何问题,请告诉我。