c# – 任何人都可以推荐一种方法来检查一个类是否可以序列化为XML?

c# – 任何人都可以推荐一种方法来检查一个类是否可以序列化为XML?,第1张

概述我有一个Generic类,它接受类型为T的对象,将其序列化为 XML,然后将其保存到文件系统.目前,如果对象不可序列化,则序列化 *** 作将失败.这不是问题,但我认为最好在我的类构造函数中检查T的实例是否可序列化,如果不是,则在该点抛出错误而不是稍后抛出错误. 是否有一种检查T实例的方法可以序列化为XML,而不是简单地实例化它并尝试在TRY … CATCH中序列化它?如果我能以某种方式询问类T以发现它是 我有一个Generic类,它接受类型为T的对象,将其序列化为 XML,然后将其保存到文件系统.目前,如果对象不可序列化,则序列化 *** 作将失败.这不是问题,但我认为最好在我的类构造函数中检查T的实例是否可序列化,如果不是,则在该点抛出错误而不是稍后抛出错误.

是否有一种检查T实例的方法可以序列化为XML,而不是简单地实例化它并尝试在TRY … CATCH中序列化它?如果我能以某种方式询问类T以发现它是否可以序列化为XML,那将是很好的.

如果有帮助,可以在这里看到代码:http://winrtstoragehelper.codeplex.com/SourceControl/changeset/view/ac24e6e923cd#WinRtUtility%2fWinRtUtility%2fObjectStorageHelper.cs

请注意,此代码是针对WinRT编译的(即,它用于windows 8应用程序)但是我认为这个问题与任何C#方言有关.

提前致谢

杰米

解决方法 AFAIK,即使您检查各种属性(Serializable,DataContract)或检查Type.IsSerializable(我认为它只是检查Serializable属性存在的便捷方法),它并不保证实现实际上是可序列化的. (编辑:如上所述,在问题中提供的示例代码中可以看到,XmlSerializer不依赖于Serializable属性装饰.所以检查这些标志是没有意义的.)

根据我的经验,最好的办法是使用单元测试来验证应用程序中使用的各种类型,并使用try / catch查看它是否通过.在运行时,使用try / catch(而不是每次预检)并记录/处理异常.

如果您有单元测试的有效兼容类型列表,则可以根据先前测试确定的编译时列表预先检查T,并假设任何其他类型都没有问题.可能想要观察已知有效类型的子类,即使它们从有效的可序列化类型继承,但它们的实现可能不是.

编辑:由于这是针对windows Phone 8,虽然我没有该平台的经验,但我使用过Silverlight.在这种情况下,您可以序列化对象,即使它们未标记为[Serializable](事实上,它甚至不存在于Silverlight中).无论装饰如何,内置的XmlSerializer都可以对抗所有公共属性.查看它是否可序列化的唯一方法是尝试序列化和尝试/捕获失败,或者编写算法来检查每个属性(并递归地通过子对象)并检查每个类型是否可以序列化.

EDITx2:看看你的ObjectStorageHelper,我建议你只是尝试序列化并捕获任何失败.您不一定要直接冒泡.您可以使用自己的自定义异常进行换行,也可以使用返回的结果对象通知API使用者序列化的通过/失败以及可能失败的原因.最好假设调用者使用的是有效对象,而不是每次都进行昂贵的检查.

EDITx3:由于你在save方法中做了很多其他工作,我建议你重写这样的代码:

public async Task SaveAsync(T Obj){    if (Obj == null)        throw new ArgumentNullException("Obj");    Storagefile file = null;    StorageFolder folder = GetFolder(storageType);    file = await folder.CreatefileAsync(filename(Obj),CreationCollisionoption.ReplaceExisting);    IRandomAccessstream writeStream = await file.OpenAsync(fileAccessMode.ReaDWrite);    using (Stream outStream = Task.Run(() => writeStream.AsstreamForWrite()).Result)    {        try        {            serializer.Serialize(outStream,Obj);        }        catch (InvalIDOperationException ex)        {            throw new TypeNotSerializableException(typeof(T),ex);        }        await outStream.FlushAsync();    }}

这样您就可以专门捕获序列化问题,并且可以非常清楚地向API使用者报告他们提供了无效/不可序列化的对象.这样,如果您将异常作为I / O部分的一部分抛出,则问题更明确.实际上,您可能希望将序列化/反序列化方面分离到它们自己的离散方法/类,以便您可以提供其他序列化程序(或者从问题所在的堆栈跟踪中更清楚,或者只是让您的方法执行一个事情和唯一的事情)但是任何更多的重写/重构实际上都留给了代码审查,并且对于手头的问题无效.

仅供参考,我还对您的输入对象进行了空检查,因为如果用户传递null,他们会认为保存是成功的,实际上没有任何反应,并且他们可能期望一个值可以在以后加载存在.如果要允许空值作为有效值,那么不要打扰抛出错误的检查.

总结

以上是内存溢出为你收集整理的c# – 任何人都可以推荐一种方法来检查一个类是否可以序列化为XML?全部内容,希望文章能够帮你解决c# – 任何人都可以推荐一种方法来检查一个类是否可以序列化为XML?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1251195.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存