需要序列化一些包含DrawingBrush的BL结构。我把它改写如下:
[ProtoContract]
public class BaseProtoBuf : INotifyPropertyChanged, IFormattable
{
[ProtoMember(1)]
public string ID { get; set; }
// Bunch of properties of .net primitive types
// ..
private DrawingBrush _geometry;
[ProtoMember(9)]
[Browsable(false)]
public DrawingBrush Geometry
{
get { return _geometry; }
set
{
_geometry = value;
ScaleDrawing();
}
}
}
[ProtoContract]
[ProtoInclude(1, typeof(string))]
// All other includes
[ProtoInclude(9, typeof(DrawingBrush)]
public class DerivedProtoBuf : BaseProtoBuf, ICloneable
{
// Some additional properties of primitive types, annotated starting with ProtoMember 10 and so on
}要序列化,我将执行以下代码:
const string fileName = "Protobuf.bin";
using (var file = File.Create(fileName))
{
file.Position = 0;
var testBase = new BaseProtoBuf
{
Height = 100,
Width = 100,
Name = "Test 1",
OffsetX = 200,
OffsetY = 200,
Geometry = sourceList[0].Geometry // some not-null DrawingBrush
};
Serializer.Serialize(file, testBase);
file.Position = 0;
var restored = Serializer.Deserialize<BaseProtoBuf>>(file);
}
}我需要序列化派生类对象,但是在基本序列化过程中,我得到了“找不到合适的默认DrawingBrush编码”。认为这是因为对于某些对象,DrawingBrush可以是空的,但是在测试的对象中,它不是空的。有什么解决办法可以正确地序列化基本对象,使用非空DrawingBrush 2)派生的带有空DrawingBrush的对象?提前谢谢。
发布于 2012-05-04 12:07:38
正确的RuntimeTypeModel配置,用于序列化简单的WPF刷:
RuntimeTypeModel.Default.Add(typeof(Brush), false)
.AddSubType(300, typeof(SolidColorBrush));
RuntimeTypeModel.Default.Add(typeof(SolidColorBrush), false)
.Add("Color");
RuntimeTypeModel.Default.Add(typeof(Color), false)
.Add("A", "R", "G", "B"); // needed for proper color serialization
RuntimeTypeModel.Default.Add(typeof(SolidColorBrush), false)
.Add("Color");
RuntimeTypeModel.Default.Add(typeof(DrawingBrush), false)
.Add("Stretch", "Drawing");
RuntimeTypeModel.Default.Add(typeof(Drawing), false)
.AddSubType(100, typeof(DrawingGroup))
.AddSubType(200, typeof(GeometryDrawing));
RuntimeTypeModel.Default.Add(typeof(DrawingGroup), false)
.Add("Children");
RuntimeTypeModel.Default.Add(typeof(Pen), false)
.Add("Brush", "Thickness", "LineJoin");
RuntimeTypeModel.Default.Add(typeof(GeometryDrawing), false)
.Add("Brush", "Geometry", "Pen");发布于 2012-04-28 08:05:01
由于没有定义契约,因此DrawingBrush不能立即序列化。这里有各种选择:
如果类型相当简单,您可以通过needed
中为框架构造所需的值。
https://stackoverflow.com/questions/10361220
复制相似问题