[Mono-bugs] [Bug 552891] New: Mono can't deserialize Nullable objects created by .NET

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Thu Nov 5 11:02:15 EST 2009


http://bugzilla.novell.com/show_bug.cgi?id=552891


           Summary: Mono can't deserialize Nullable objects created by
                    .NET
    Classification: Mono
           Product: Mono: Runtime
           Version: 2.4.x
          Platform: x86
        OS/Version: All
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: remoting
        AssignedTo: lluis at novell.com
        ReportedBy: jorge.matias at fractaliasoftware.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---


User-Agent:       Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US)
AppleWebKit/532.0 (KHTML, like Gecko) Chrome/3.0.195.27 Safari/532.0

Mono can't deserialize classes that include any kind of Nullable object when
they have been serialized with .NET and they have been assigned a value which
is not null.

Sample code:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

using NUnit.Framework;

namespace TestSerialization
{
    [Serializable]
    class SimpleClass
    {
        string id;
        DateTime? nullableTimeStamp;
        int? nullableInt;

        public string Id
        {
            get { return id; }
            set { id = value; }
        }

        public DateTime? NullableTimeStamp
        {
            get { return nullableTimeStamp; }
            set { nullableTimeStamp = value; }
        }

        public int? NullableInt
        {
            get { return nullableInt; }
            set { nullableInt = value; }
        }

        public override bool Equals(object obj)
        {
            try
            {
                SimpleClass c = (SimpleClass)obj;
                return id.Equals(c.id) 
                    && nullableTimeStamp.Equals(c.nullableTimeStamp)
                    && nullableInt.Equals(c.nullableInt);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return false;
            }
        }
    }

    [TestFixture]
    public class NullableSerializationTest
    {
        SimpleClass c;

        public NullableSerializationTest()
        {
            c = new SimpleClass();
            c.Id = "123456";
            c.NullableTimeStamp = null;
            c.NullableInt = null;
        }

        void SerializeObject(Object o, string file)
        {
            Stream stream = File.Create(file);
            BinaryFormatter oFormatter = new BinaryFormatter();
            oFormatter.Serialize(stream, o);
            stream.Close();
        }

        Object DeserializeObject(string file)
        {
            Stream stream = File.OpenRead(file);
            BinaryFormatter oFormatter = new BinaryFormatter();
            Object o = oFormatter.Deserialize(stream);
            stream.Close();
            return o;
        }

        [Test]
        public void TestSerialization()
        {
            SerializeObject(c, "simpleobj.bin");
        }

        [Test]
        public void TestDeserialization()
        {
            SimpleClass c2 = (SimpleClass) DeserializeObject("simpleobj.bin");
            Assert.AreEqual(c, c2);
        }
    }
}


Reproducible: Always

Steps to Reproduce:
1. Change the following lines:
 a) Replace 
      c.NullableTimeStamp = null; 
    by 
      c.NullableTimeStamp = DateTime.Parse("1/1/2009");
or
 b) Replace
      c.NullableInt = null;
    by
      c.NullableInt = 10;

2. Run TestSerialization from .NET 2.0 or 3.5 (I tested both).

3. Run TestDeserialization from Mono 2.4 (tested on Windows, OpenSUSE and Mac
OS X).

Actual Results:  
1.a (after changing the Nullable DateTime value):

TestCase 'TestSerialization.NullableSerializationTest.TestDeserialization'
failed: System.ArgumentOutOfRangeException : Value 4159925407799315720 is
outside the valid range [0,3155378975999999999].
Parameter name: ticks
    at System.DateTime..ctor (Int64 ticks) [0x00000]
    at System.DateTime..ctor (Int64 ticks, DateTimeKind kind) [0x00000]
    at System.DateTime.FromBinary (Int64 dateData) [0x00000]
    at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadPrimitiveTypeValue
(System.IO.BinaryReader reader, System.Type type) [0x00000]

1.b (after changing the Nullable int value):

TestCase 'TestSerialization.NullableSerializationTest.TestDeserialization'
failed: System.Runtime.Serialization.SerializationException : Unexpected binary
element: 0
    at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject
(BinaryElement element, System.IO.BinaryReader reader, System.Int64& objectId,
System.Object& value, System.Runtime.Serialization.SerializationInfo& info)
[0x00000]
    at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject
(System.IO.BinaryReader reader) [0x00000]

Expected Results:  
The object is deserialized correctly and the test is succesfully run for every
case.

The exceptions don't happen if:
- Both objects are set to null.
- The Nullable part of the object definitions is removed, that is, the objects
are defined as DateTime or int or whatever.

BTW, do you guys know how could a workaround be developed for this problem with
a custom SurrogateSelector? Thanks!

-- 
Configure bugmail: http://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.


More information about the mono-bugs mailing list