如何添加类型约束以在通用方法中包含可序列化的内容?
-
09-09-2019 - |
题
我的通用方法需要序列化传递给它的对象,但是仅坚持认为它实现了iSerializizable似乎行不通。例如,我有一个从Web服务返回的结构(标记为serializableAttribute),该结构可以序列到XML,但正如预期的那样,C#编译器会抱怨。
有什么方法我可以在尝试序列化之前检查对象是可序列化的,或者更好的是使用该对象 where
检查对象的关键字合适?
这是我的完整方法:
public static void Push<T>(string url, T message)
where T : ISerializable
{
string xml = SerializeMessage(message);
// Send the message to Amazon SQS
SendMessageRequest sendReq = new SendMessageRequest { QueueUrl = url, MessageBody = xml };
AmazonSQSClient client = new AmazonSQSClient(S3User, S3Pass);
client.SendMessage(sendReq);
}
和Serializemessage:
private static string SerializeMessage<T>(T message)
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
using (StringWriter stringWriter = new StringWriter())
{
xmlSerializer.Serialize(stringWriter, message);
return stringWriter.ToString();
}
}
如果不可能,执行对象在运行时可以序列化的检查的最佳方法是什么?
解决方案
您不能通过通用约束完全做到这一点,但是您可以做几件事来帮助:
1)放 新的() 对通用类型的限制(为了使XMLSerialializer的能力不缺乏默认的CTOR):
where T : new()
2)在处理序列化的方法的第一行中(或构造函数或其他任何您不必一遍又一遍地重复的地方),您可以执行此检查:
if( !typeof(T).IsSerializable && !(typeof(ISerializable).IsAssignableFrom(typeof(T)) ) )
throw new InvalidOperationException("A serializable Type is required");
当然,在尝试序列化类型时,仍然存在运行时例外的可能性,但这将涵盖最明显的问题。
其他提示
我写了一篇有关此主题的长度博客文章,您可能会发现有帮助。它主要用于二进制序列化,但这些概念适用于大多数序列化格式。
长而短的是
- 没有办法添加可靠的通用约束
- 检查并查看对象是否的唯一方法 曾是 可序列化是序列化并查看操作是否成功
知道对象是否可以序列化的唯一方法是尝试序列化。
实际上,您在问如何判断一种类型是否“可序列化”,但是实际问题是关于对象的。即使标记类型[可序列化],某些类型的实例也可能无法序列化。例如,如果该实例包含循环引用怎么办?
代替
XmlSerializer XMLSerializer =新的XMLSerializer(typeof(t));
尝试
XmlSerializer XMLSerializer = new XMLSerializer(message.getType());
不隶属于 StackOverflow