I’m currently working on a project where we are using Microsoft Orleans, an actor implementation optimized for Azure. Everything was working fine until we tried to add a web role with an Orleans client to interact with our Orleans silos through a Web API.
However when we tried to send a message from the Web Api to the silo, following error message showed up inside the logs:
!!!!!!!!!! Exception deserializing message body Exc level 0: System.Runtime.Serialization.SerializationException: Unsupported type 'Sample.Contracts.SampleMessage' encountered. Perhaps you need to mark it [Serializable] or define a custom serializer for it? at Orleans.Serialization.SerializationManager.DeserializeInner(Type expected, BinaryTokenStreamReader stream) at Orleans.Serialization.BuiltInTypes.DeserializeOrleansResponse(Type expected, BinaryTokenStreamReader stream) at Orleans.Serialization.SerializationManager.DeserializeInner(Type expected, BinaryTokenStreamReader stream) at Orleans.Serialization.SerializationManager.Deserialize(Type t, BinaryTokenStreamReader stream) at Orleans.Serialization.SerializationManager.Deserialize(BinaryTokenStreamReader stream) at Orleans.Runtime.Message.DeserializeBody(List
1 bytes)`
This is how the message object looked like:
First step towards the solution is checking your NuGet packages. It is important that all projects inside your solution are using the same version of Orleans. In our case we noticed that although most projects where using Orleans 1.2.4, a 1.2.3 version sneaked into one of our projects:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Orleans.Core" version="1.2.3" targetFramework="net452" />
<package id="Newtonsoft.Json" version="8.0.2" targetFramework="net452" />
</packages>
Ok, one problem fixed. But after deploying again, exactly the same error appeared. We’ll continue our journey in a next post…