Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否确保参数可序列化?_C#_Serialization - Fatal编程技术网

C# 是否确保参数可序列化?

C# 是否确保参数可序列化?,c#,serialization,C#,Serialization,好的,让我看看我是否能尽可能简洁。我将把一个未知类型的对象传递到一个方法中,该方法将在内部使用二进制格式化程序来序列化它传递的数据(我选择这个方法是因为我不知道数据是什么,所以这是我能想象到的最抽象的机制)。让我们假设该方法当前看起来是这样的: public void ProvideData(Guid providerKey, ISerializable data, string dataType)... 现在,让我们假设我需要确保传递给我的内容实际上可以序列化,因此,为什么我认为我需要对象实

好的,让我看看我是否能尽可能简洁。我将把一个未知类型的
对象
传递到一个方法中,该方法将在内部使用
二进制格式化程序
来序列化它传递的数据(我选择这个方法是因为我不知道数据是什么,所以这是我能想象到的最抽象的机制)。让我们假设该方法当前看起来是这样的:

public void ProvideData(Guid providerKey, ISerializable data, string dataType)...
现在,让我们假设我需要确保传递给我的内容实际上可以序列化,因此,为什么我认为我需要对象实现
ISerializable
。然而,这个模型的一个问题是,我甚至不能传入
字符串
,因为即使
字符串
[Serializable]
它也不能实现
ISerializable


那么,构造此方法以确保传递给我的值(简单或复杂)可序列化的正确方法是什么?

您可以使用
类型上的属性进行检查

例如:

bool canSerialize = myParameter.GetType().IsSerializable;
按OP编辑:最终实现的方法 下面是这个答案的最终实现(非常好的答案)。这只是一个原型,所以这就是为什么这个方法没有太多的进展,但它证明了答案。需要注意的一点是,检查是否存在
ISerializable
接口没有任何价值,因为在尝试序列化对象之前,您不知道它是否应该实现
ISerializable
,所以我走错了方向

谢谢

public void ProvideData(Guid providerKey, object data, string dataType)
{
    if (!data.GetType().IsSerializable)
    {
        throw new ArgumentException("The data passed is not serializable and therefore is not valid.", "data");
    }

    var formatter = new BinaryFormatter();
    using (var fileStream = new FileStream("data.dat", FileMode.Create))
    {
        formatter.Serialize(fileStream, data);
        fileStream.Close();
    }
}

+1比删除属性更容易。它是否涵盖类型是否也实现了ISerializable
?+1它不检查ISerializable,但比属性搜索更简单(即使所有基类都执行检查)。请注意,这并不保证对象实际上可以序列化。例如,它可以是一个可序列化的容器,将不可序列化的对象分配给它的一个或多个字段。为了确保某个对象的实际实例是可序列化的,必须遍历该实例中所有字段的整个对象图,并确保每个字段都是可序列化的。