Bson Serialization / Deserialization of generic object

Aug 12, 2011 at 4:27 AM
Edited Aug 12, 2011 at 1:11 PM

Hello,

I have been recently testing the Bson Serialization / Deserialization side of your library and have hit something that is causing me a bit of grief.  I am sure I have overlooked something, but I am at an impasse and thought I would reach out to you.  I have included a small amount test code below.  The primary problem is that when I set the object in the class to an Int32, serialize to a memorystream, then deserialize from the memorystream I end up with the object set to a long, but with the correct value.  I have verified that the value is being read from the stream correctly in the BsonReader.ReadType method as an Integer, yet the object in the deserialized class ends up being a long.  Another place you can see something odd happening is if you set the object to a class object.  The object serializes out of the byte array as a Newtonsoft.Json.Linq.JObject instead of the actual class.  Do you have any suggestions?

Thank you

simple class:
    [Serializable]
    public class Test1
    {
        public int TestVal1 { get; set; }
        public object TestVal2 { get; set; }
    }

simple console app:
    class Program
    {
        static void Main(string[] args)
        {
            Test1 t1 = new Test1();
            t1.TestVal1 = 12;
            t1.TestVal2 = (int)13;

            JsonSerializer Js = new JsonSerializer();
            MemoryStream Ms = new MemoryStream();
            BsonWriter Bw = new BsonWriter(Ms);

            Js = new JsonSerializer();
            Js.Serialize(Bw, t1);
            Bw.Flush();
            Ms.Position = 0;
            BsonReader Br = new BsonReader(Ms);

            Test1 xx = Js.Deserialize<Test1>(Br);
            Console.ReadLine();

        }
    }


Watch window from debug:
-  t1 {BsonTest3.Test1} BsonTest3.Test1
  TestVal1 12 int
  TestVal2 13 object {int}
-  xx {BsonTest3.Test1} BsonTest3.Test1
  TestVal1 12 int
  TestVal2 13 object {long}

 

Apr 7, 2014 at 2:22 PM
Hi exeter

See this conversation (http://json.codeplex.com/discussions/350511)

Looks like it's a known problem with Json.net.

Easiest solution is try and use a long. Maybe implement an intermediary class?

Or follow mruston's idea of customising the NewtonSoft source code to fix it.

Perhaps they'll fix it one day - who knows?