我的通用方法需要序列化传递给它的对象,但是仅坚持认为它实现了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());

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top