7

複合型をシリアライズ/デシリアライズしようとしています。つまり、オブジェクトのインスタンスがオブジェクト グラフで複数回参照される場合、逆シリアル化中に、デシリアライザーがそのインスタンスを 1 回だけ作成し、複数回参照するようにします (そのオブジェクト インスタンスを作成するのではなく)。複数回)。

システムが対処する必要がある 2 番目のことは、キーが複合型そのものである辞書です。

XML にシリアル化する DataContractSerializer で両方を実現できました。ただし、これを実行できる Json シリアライザーが見つかりません。Json.NET と ServiceStack を試しましたが、うまくいきませんでした。

以下のサンプル コードを参照してください。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Xml;
using Newtonsoft.Json;

namespace Serialization
{
    class Program
    {

        static void Main(string[] args)
        {
            var transportModel = CreateSampleModel();


            //Serialize with DataContractSerializer
            var serializer = new DataContractSerializer(typeof(TransportModel), null, int.MaxValue, false, true, null, null);
            string serializedObjectXml;
            using (var sw = new StringWriter())
            {
                using (var writer = new XmlTextWriter(sw))
                {
                    serializer.WriteObject(writer, transportModel);
                    writer.Flush();
                    serializedObjectXml = sw.ToString();
                }
            }

            //Deserialize with DataContractSerializer
            byte[] byteArray = Encoding.ASCII.GetBytes(serializedObjectXml);
            var stream = new MemoryStream(byteArray);
            var deserializedObjectXml = serializer.ReadObject(stream);


            //Serialize with Json.NET
            var serializedObjectJson=JsonConvert.SerializeObject(transportModel);

            //Deserialize with Json.NET - this fails because of the key in the dictionary being a complex type
            var deserializedObjectJson = JsonConvert.DeserializeObject(serializedObjectJson);
        }


        static TransportModel CreateSampleModel()
        {
            var transportModel = new TransportModel();

            // dests
            var fra = new Destination
            {
                Id = 0,
                Name = "FRA",
                Demand = 900
            };
            var det = new Destination
            {
                Id = 1,
                Name = "DET",
                Demand = 1200
            };


            var dests = new List<Destination> { fra, det};

            //origs
            var gary = new Origin
            {
                Id = 0,
                Name = "GARY",
                Supply = 1400,
                Cost = new Dictionary<Destination, int>{
                    {fra, 39},
                    {det, 14}
                }
            };


            var origs = new List<Origin> { gary};

            transportModel.Destinations = dests;
            transportModel.Origins = origs;

            return transportModel;
        }
    }

    [DataContract]
    class Destination
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public int Demand { get; set; }
    }

    [DataContract]
    class Origin
    {
        [DataMember]
        public int Id { get; set; }
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public int Supply { get; set; }
        [DataMember]
        public Dictionary<Destination, int> Cost { get; set; }
    }

    [DataContract]
    class TransportModel
    {
        [DataMember]
        public List<Origin> Origins;
        [DataMember]
        public List<Destination> Destinations;

        public TransportModel()
        {
            Origins = new List<Origin>();
            Destinations = new List<Destination>();
        }
    }
}
4

2 に答える 2

14

Json.NETは、オブジェクト参照の処理をサポートしています。オブジェクト参照の保持

複雑な型の辞書キーは、型を文字列との間で変換するTypeConverterを作成することで処理できます。Json.NETは、その文字列を辞書キーとして使用します。

于 2012-07-26T04:25:16.687 に答える
0

参照を保持する .NET の組み込み BinaryFormatter を使用します。

個人的には、循環依存関係を持つオブジェクト グラフ BLOB の使用を思いとどまらせます。

データ転送オブジェクト (つまり、シリアル化に使用される型) は、理想的には、クリーンで自己記述的であり、一般的でバージョン管理可能で寛容な形式でシリアル化されている必要があります。

于 2012-07-25T08:25:43.793 に答える