barteloma
barteloma

Reputation: 6875

Binary serialization without serializable attribute

I want to serailize my object and used BinaryFormatter class.

public static byte[] BinarySerialize(IMessage message)
{
    using (var stream = new MemoryStream())
    {
        var formatter = new BinaryFormatter();

        formatter.Serialize(stream, message);

        return stream.ToArray();
    }
}

But when I run the code, throws an exception.

SerializationException: Object is not marked as serializable.

I think this exception thrown by BinaryFormatter.

I do not want to mark as [Serializable] my objects. Or my library users may forget mark as [Serializable] their own Messages.

Is there any other way to binary serialize my objects without using [Serializable] attribute?

Upvotes: 9

Views: 13933

Answers (3)

M.Hassan
M.Hassan

Reputation: 11072

To avoid Net4x built in Serialization that require the [Serializable] attribute, use Newtonsoft.Json or System.Text.Json in netcore 3.1+ or Net5

 
string json= JsonConvert.SerializeObject(message); 

//or System.Text.Json in netcore 3.1+
string json=  System.Text.Json. JsonSerializer.Serialize(message);

Upvotes: 1

Low Flying Pelican
Low Flying Pelican

Reputation: 6054

Since [Serializable] attribute cannot be added runtime, there are nooptions if you want to stick to the .Net built in Serialization.

You can

  1. Use ISerializable interface in IMessage so that users has to implement Serialization in their implementations
  2. Use an external library such as: http://sharpserializer.codeplex.com/ And by the way, they have moved to GitHub. See: https://github.com/polenter/SharpSerializer

    public static byte[] BinarySerialize(IMessage message)
    {
        using (var stream = new MemoryStream())
        {
            var serializer = new SharpSerializer(true);
    
            serializer.Serialize(message, stream );
    
            return stream.ToArray();
        }
    }   
    
  3. Use JSON serialization

Upvotes: 5

P.Brian.Mackey
P.Brian.Mackey

Reputation: 44285

In addition to the other answers regarding 3rd party libs, depending on your needs you may choose to use XmlSerializer. (Better yet use a JSON serializer that doesn't require the SerializeableAttribute.)

These serializers do not require [Serializeable]. However, the XmlSerializer doesn't allow serialization of interfaces either. If you are good with concrete types it works. Compare serialization options.

E.G.

void Main()
{
    var serialized = Test.BinarySerialize(new SomeImpl(11,"Hello Wurld"));
}

public class Test
{
    public static string BinarySerialize(SomeImpl message)
    {
        using (var stream = new StringWriter())
        {
            var formatter = new XmlSerializer(typeof(SomeImpl));

            formatter.Serialize(stream, message);

            return stream.ToString().Dump();
        }
    }

}

public class SomeImpl
{
    public int MyProperty { get;set;}
    public string MyString { get;set; }

    public SomeImpl() {}

    public SomeImpl(int myProperty, String myString)
    {
        MyProperty = myProperty;
        MyString = myString;
    }
}

Upvotes: 2

Related Questions