Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ensure a parameter is serializable?

Okay, so let me see if I can make this as concise as possible. I am going to be passing in an object of an unknown type into a method that is going to internally use the BinaryFormatter to serialize the data it's passed (I chose this because I have no idea what the data is so it's the most abstract mechanism I could imagine). And let's assume that method looks like this currently:

public void ProvideData(Guid providerKey, ISerializable data, string dataType)...

Now let's assume I need to make sure what's passed to me can in fact be serialized and so that why I thought I would require the object to implement ISerializable. However, one issue with this model is that I can't even pass in a string because eventhough a string is [Serializable] it doesn't implement ISerializable.

So, what is the proper way to structure this method to ensure that the value passed to me, simple or complex, is serializable?

like image 814
Mike Perrenoud Avatar asked Sep 12 '12 12:09

Mike Perrenoud


People also ask

How do you determine if the given object is serializable?

You can determine whether an object is serializable at run time by retrieving the value of the IsSerializable property of a Type object that represents that object's type.

What does it mean to serialize a variable?

Serialization is the process of converting a data object—a combination of code and data represented within a region of data storage—into a series of bytes that saves the state of the object in an easily transmittable form.

What is the meaning of serializable?

To serialize an object means to convert its state to a byte stream so that the byte stream can be reverted back into a copy of the object. A Java object is serializable if its class or any of its superclasses implements either the java. io. Serializable interface or its subinterface, java. io.

How do you prevent a variable from being serialized in a serializable class?

You can prevent member variables from being serialized by marking them with the NonSerialized attribute as follows. If possible, make an object that could contain security-sensitive data nonserializable. If the object must be serialized, apply the NonSerialized attribute to specific fields that store sensitive data.


1 Answers

You can check by using the IsSerializable property on the Type.

For example:

bool canSerialize = myParameter.GetType().IsSerializable;

EDIT BY OP: Final Implemented Method

Below is the final implementation because of this answer (very good answer). It is just a prototype so that's why there's not a lot going on in the method but it proves the answer. One thing to note is that checking for the existence of the ISerializable interface holds no value because you won't know until you try and serialize the object whether or not it should have implemented ISerializable so I was moving down the wrong path there.

Thanks!

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();
    }
}
like image 120
Dave R. Avatar answered Oct 13 '22 20:10

Dave R.