0

I've been trying to convert our service stack app host and client to use MsgPack serialization. I kept getting the exception

MsgPack.InvalidMessagePackStreamException Stream Unexpectedly Ends

After some investigation I've tracked it down to DateTimeOffset field in the response object.

Client Code

using System;

namespace Client
{
    using Server;

    using ServiceStack.MsgPack;

    class Program
    {
        static void Main(string[] args)
        {
            var client = new MsgPackServiceClient("http://localhost:1337");

            var response = client.Get(new GetRequest());

            Console.WriteLine("Response: [{0}] {1}", response.Timestamp, response.Result);

            Console.ReadKey();
        }
    }
}

Server Code

using System;

namespace Server
{
    using System.Reflection;

    using ServiceStack;
    using ServiceStack.MsgPack;

    class Program
    {
        static void Main(string[] args)
        {
            var listeningOn = args.Length == 0 ? "http://localhost:1337/" : args[0];
            using (var appHost = new AppHost("Test", Assembly.GetAssembly(typeof(GetService))))
            {
                appHost.Init()
                    .Start(listeningOn);

                Console.WriteLine("AppHost Created at {0}, listening on {1}", DateTime.Now, listeningOn);

                Console.ReadKey();
            }
        }
    }

    public class AppHost : AppHostHttpListenerBase
    {
        public AppHost(string serviceName, params Assembly[] assembliesWithServices)
            : base(serviceName, assembliesWithServices)
        {
        }

        public override void Configure(Funq.Container container)
        {
            Plugins.Add(new MsgPackFormat());
        }
    }

    [Route("/GetRequest", Verbs = "GET")]
    public class GetRequest : IReturn<GetResponse> { }

    public class GetResponse
    {
        public string Result { get; set; }

        public string Timestamp { get; set; }
        //public DateTimeOffset Timestamp { get; set; }
    }

    public class GetService : Service
    {
        public GetResponse Get(GetRequest request)
        {
            return new GetResponse { Result = "Success", Timestamp = DateTimeOffset.UtcNow.ToString() };
            //return new GetResponse { Result = "Success", Timestamp = DateTimeOffset.UtcNow };
        }
    }
}

The example works without DateTimeOffset but fails with the exception when its included.

The MessagePackSerializer class appears to work as expected as demonstrated by the following test.

public static void SerializeTest()
{
    var response = new GetResponse { Result = "Success", Timestamp = DateTime.UtcNow };
    var serializer = MessagePackSerializer.Get<GetResponse>();

    var asSingleObject = serializer.PackSingleObject(response);
    var fromSingleObject = serializer.UnpackSingleObject(asSingleObject);

    var packStream = new MemoryStream();
    serializer.Pack(packStream, response);

    packStream.Position = 0;
    var fromPackStream = serializer.Unpack(packStream);

    packStream.Position = 0; 
    serializer.PackTo(Packer.Create(packStream), response);

    packStream.Position = 0;
    var fromPacker = serializer.Unpack(packStream);
}

In each case the response is packed\unpacked correctly with DateTimeOffset property.

I've tried custom serializer for DateTimeOffset but that fails the same way.

MsgPack.Cli 0.5.7 ServiceStack 4.0.35

antinutrino
  • 169
  • 11
  • Sounds like a bug in the [.NET MessagePack Serializer](https://github.com/msgpack/msgpack-cli), you can [submit an issue](https://github.com/msgpack/msgpack-cli/issues) – mythz Jan 02 '15 at 01:20
  • 1
    For completeness, please edit your question to include your code (more specifically, a [Minimal, Complete, and Verifiable](http://stackoverflow.com/help/mcve) example). – Andrew Jan 02 '15 at 01:53
  • @mythx issue added https://github.com/msgpack/msgpack-cli/issues/59 – antinutrino Jan 02 '15 at 22:26

0 Answers0