複合型をシリアライズ/デシリアライズしようとしています。つまり、オブジェクトのインスタンスがオブジェクト グラフで複数回参照される場合、逆シリアル化中に、デシリアライザーがそのインスタンスを 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>();
}
}
}