【问题标题】:Deserialize a type containing a Dictionary property using ServiceStack JsonSerializer使用 ServiceStack JsonSerializer 反序列化包含 Dictionary 属性的类型
【发布时间】:2013-02-05 21:12:11
【问题描述】:

下面的代码 sn-p 显示了我可以实现此目的的两种方法。第一个使用MsgPack,第二个测试使用ServiceStack's JSONSerializer。第二个更有利,因为 ServiceStack.Text JSONSerializer 在我工作的整个项目中都使用。

为什么使用 Dictionary> 时下面的第二个测试会失败?

[TestFixture]
public class NeighbourhoodTests
{
    private Neighbourhood _myNeighbourhood;
    private Street _street;

    [SetUp]
    public void SetupOnEachTest()
    {
        _street = new Street() { Name = "Storgate" };
        _myNeighbourhood = SetupMyNeighbourhood(_street);
    }

    private static Neighbourhood SetupMyNeighbourhood(Street street)
    {
        var myNeighbourhood = new Neighbourhood();
        myNeighbourhood.Addresses = new Dictionary<Street, HashSet<int>>();

        myNeighbourhood.Addresses.Add(street, new HashSet<int>(new[] { 1, 2, 3, 4 }));
        myNeighbourhood.LocalCouncilName = "Stavanger";
        myNeighbourhood.RegionName = "Rogaland";
        return myNeighbourhood;
    }

    [Test]
    public void TestNeighbourhoodClass_OnMsgPackDeserialization_AddressesShouldEqualOriginalInput()
    {
        ObjectPacker packer = new ObjectPacker();
        var packedMessageBytes = packer.Pack(_myNeighbourhood);
        var unpackedMessage = packer.Unpack(packedMessageBytes);

        Assert.That(unpackedMessage.RegionName, Is.EqualTo("Rogaland"));
        Assert.That(unpackedMessage.Addresses, Is.Not.Empty);
        Assert.That(unpackedMessage.Addresses.Keys.Any(key => key.Name.Equals(_street.Name)));
    }

    [Test]
    public void TestNeighbourhoodClass_OnServiceStackJsonTextDeserialization_AddressesShouldEqualOriginalInput()
    {
        string serialisedMessage = JsonSerializer.SerializeToString(_myNeighbourhood);
        var deserializedMessage = JsonSerializer.DeserializeFromString(serialisedMessage);

        Assert.That(deserializedMessage.RegionName, Is.EqualTo("Rogaland"));
        Assert.That(deserializedMessage.Addresses, Is.Not.Empty);
        Assert.That(deserializedMessage.Addresses.Keys.Any(key => key.Name.Equals(_street.Name)));
    }
}

public class Neighbourhood
{
    public Dictionary<Street, HashSet<int>> Addresses { get; set; }
    public string LocalCouncilName { get; set; }
    public string RegionName { get; set; }
}

【问题讨论】:

    标签: .net serialization deserialization servicestack msgpack


    【解决方案1】:

    感谢@mortenrøgenes- 原来我必须将 Neighborhood 类的 Addresses 属性包装成它自己的类型:

    public class Addresses
    {
        public Street Street{ get; set; }
        public HashSet<int> HouseNumbers { get; set; }
    }
    public class Neighbourhood
    {
        public Addresses { get; set; }
        public string LocalCouncilName { get; set; }
        public string RegionName { get; set; }
    }
    

    这样,ServiceStack JSONSerializer 就可以工作并且测试会通过。

    【讨论】:

      猜你喜欢
      • 2016-10-21
      • 1970-01-01
      • 2012-11-03
      • 2011-10-31
      • 2012-09-07
      • 1970-01-01
      • 2020-10-18
      • 2013-05-23
      • 1970-01-01
      相关资源
      最近更新 更多