Brush
型を(除外して)シリアライズできないというJson.NETのさまざまな質問と回答を読んだ後、私自身がJsonConverter
を必要としていたことは明らかでした。しかし、私が立ち往生しているところでは、私はデータを扱うために中間のオブジェクトを使用していますが、ブラシのタイプによってさまざまな型付きオブジェクトが存在するため、型情報もJsonに格納する必要があると思いますただし、[JsonProperty(TypeNameHandling = TypeNameHandling.All)]
を使用している場合は機能しません。JsonConverterを使用してさまざまな `Brush`型をシリアライズ/デシリアライズ
マイコンバータ:
public class BrushJsonConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
object SerializableBrush = null;
if (value is SolidColorBrush)
SerializableBrush = new SerializableColorBrush(value as SolidColorBrush);
var jo = JObject.FromObject(SerializableBrush);
jo.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
// Load JObject from stream
var jObject = JObject.Load(reader);
dynamic SerializableBrush = JsonConvert.DeserializeObject(jObject.ToString());
if (SerializableBrush is SerializableColorBrush)
return (SerializableBrush as SerializableColorBrush).ToBrush();
else if (SerializableBrush is SerializableImageBrush)
return (SerializableBrush as SerializableImageBrush).ToBrush();
else return null;
}
public override bool CanConvert(Type objectType)
{
return typeof(Brush).IsAssignableFrom(objectType);
}
}
マイゴー間でオブジェクト:
class SerializableColorBrush
{
public Color Color{ get; set; }
public SerializableColorBrush(SolidColorBrush Brush)
{
this.Color = Brush.Color;
}
public SolidColorBrush ToBrush()
{
SolidColorBrush brush = new SolidColorBrush(this.Color);
return brush;
}
}
class SerializableImageBrush
{
public ImageSource ImageSource { get; set; }
public TileMode TileMode { get; set; }
public Stretch Stretch { get; set; }
public AlignmentX AlignmentX { get; set; }
public AlignmentY AlignmentY { get; set; }
public SerializableImageBrush(ImageBrush Brush)
{
this.ImageSource = Brush.ImageSource;
this.TileMode = Brush.TileMode;
this.Stretch = Brush.Stretch;
this.AlignmentX = Brush.AlignmentX;
this.AlignmentY = Brush.AlignmentY;
}
public ImageBrush ToBrush()
{
ImageBrush brush = new ImageBrush();
brush.ImageSource = ImageSource;
brush.TileMode = TileMode;
brush.Stretch = Stretch;
brush.AlignmentX = AlignmentX;
brush.AlignmentY = AlignmentY;
return brush;
}
}
直列化される例プロパティ:
私は迷っているprivate Brush _WindowBG = SystemColors.AppWorkspaceBrush;
[JsonConverter(typeof(BrushJsonConverter))]
[JsonProperty(TypeNameHandling = TypeNameHandling.All)]
public Brush WindowBG { get { return _WindowBG; } set { if (value != _WindowBG) { _WindowBG = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("WindowBG")); } } }
?そして私はこの方法で正しい方向に進んでいますか?
最終結果私は自分のアプリケーションのテーマデータをjsonに保存しようとしています。色、画像、またはグラデーション(まだ含まれていません)のいろいろなブラシを使用しています。