古い質問ですが、最新の Json.NET に関連しています。
ブラシを XAML としてのみシリアル化することを選択できます。これは、最終的に JSON ファイルに XAML が含まれることを意味しますが、これは私が思いついた最もクリーンなソリューションです。
ブラシの上で、JsonConvert アノテーションを使用します。
[JsonConverter(typeof(BrushJsonConverter))]
public Brush Brush {get; set;}
そして、次の JsonConverter を実装します。
/// <summary>
/// Stores a brush as XAML because Json.net has trouble saving it as JSON
/// </summary>
public class BrushJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var jo = new JObject {{"value", XamlWriter.Save(value)}};
jo.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
// Load JObject from stream
var jObject = JObject.Load(reader);
return XamlReader.Parse(jObject["value"].ToString());
}
public override bool CanConvert(Type objectType)
{
return typeof(Brush).IsAssignableFrom(objectType);
}
}
編集:純粋な JSON が必要な場合は、XAML を JSON にシリアル化することもできます。これによりパフォーマンスが低下する可能性がありますが、より整然とした結果が得られます
/// <summary>
/// Stores a brush by temporarily serializing it to XAML because Json.NET has trouble
/// saving it as JSON
/// </summary>
public class BrushJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// Turn the brush into an XML node
var doc = new XmlDocument();
doc.LoadXml(XamlWriter.Save(value));
// Serialize the XML node as JSON
var jo = JObject.Parse(JsonConvert.SerializeXmlNode(doc.DocumentElement));
jo.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
// Load JObject from stream
var jObject = JObject.Load(reader);
// Seriaze the JSON node to XML
var xml = JsonConvert.DeserializeXmlNode(jObject.ToString());
return XamlReader.Parse(xml.InnerXml);
}
public override bool CanConvert(Type objectType)
{
return typeof(Brush).IsAssignableFrom(objectType);
}
}