首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用原型网络问题序列化WPF DrawingBrush

用原型网络问题序列化WPF DrawingBrush
EN

Stack Overflow用户
提问于 2012-04-28 06:31:10
回答 2查看 515关注 0票数 1

需要序列化一些包含DrawingBrush的BL结构。我把它改写如下:

代码语言:javascript
复制
[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
}

要序列化,我将执行以下代码:

代码语言:javascript
复制
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的对象?提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-04 12:07:38

正确的RuntimeTypeModel配置,用于序列化简单的WPF刷:

代码语言:javascript
复制
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");
票数 3
EN

Stack Overflow用户

发布于 2012-04-28 08:05:01

由于没有定义契约,因此DrawingBrush不能立即序列化。这里有各种选择:

如果类型相当简单,您可以通过needed

  • otherwise,在运行时通过RuntimeTypeModel配置一个契约,在某些情况下添加属性/子类型等,使用“代理”可能是首选的--一种具有双向转换操作符的类型,用于充当正在运行的DTO --同样,可以通过RuntimeTypeModel指定代理项;“代理”让您使用现有的模型,但在DTO类型中进行交换,因为DTO考虑避免模型中的特定框架类型,只需使用您需要的信息就可以使用DTO类型。在运行时

中为框架构造所需的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10361220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档