c# - 如何添加类型约束以在泛型方法中包含任何可序列化的内容?

标签 c# generics attributes serializable

我的通用方法需要序列化传递给它的对象,但是坚持它实现 ISerializable 似乎不起作用。例如,我有一个从 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);
}

和序列化消息:

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) 将 new() 约束放在泛型上(以启用反序列化的能力并确保 XmlSerializer 不会提示缺少默认构造函数):

where T : new()

2) 在处理序列化的方法的第一行(或构造函数或其他任何您不必一遍又一遍重复它的地方),您可以执行此检查:

if( !typeof(T).IsSerializable && !(typeof(ISerializable).IsAssignableFrom(typeof(T)) ) )
    throw new InvalidOperationException("A serializable Type is required");

当然,在尝试序列化类型时仍然存在运行时异常的可能性,但这将涵盖最明显的问题。

关于c# - 如何添加类型约束以在泛型方法中包含任何可序列化的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/945495/

相关文章:

java - 泛型:如何处理类层次结构中的多个有界类型

仅当源属性存在时,XSLT 才向节点添加属性

c# - LINQ to SQL 类,如何更改列格式? (数据网格)

c# - EmguCV MatchTemplate 获取所有匹配项

c# - 未插入 NULL 值

c# - 拆分查询字符串?

java - 当 @Autowiring 使用不同的泛型类型时,Spring 不会创建不同的 bean

c# - 具有派生类型的泛型类型推断

xml - 在各种其他属性中查找属性值

java - Android自定义属性返回null