有没有办法在 protobuf-net 代理类中定义替代转换函数(从/到接口)

Posted

技术标签:

【中文标题】有没有办法在 protobuf-net 代理类中定义替代转换函数(从/到接口)【英文标题】:Is there a way to define alternative conversion functions (from/to interfaces) in a protobuf-net surrogate class 【发布时间】:2013-10-03 14:26:07 【问题描述】:

使用 protobuf-net v2 build 668,我正在尝试序列化/反序列化包含定义为接口的成员的类,同时进行动态转换。 通常,代理方法可以正常工作,但由于 C# 不允许接口的用户定义转换,我无法定义转换。

谢谢,

namespace ProtoBufNetTest

    using System.Diagnostics;
    using System.IO;

    using ProtoBuf;
    using ProtoBuf.Meta;

    class Program
    
        static void Main()
        
            RuntimeTypeModel.Default.Add(typeof(IDummy), false)
                .SetSurrogate(typeof(DummySurrogate));

            var container = new Container  Data = new Dummy  Positive = 3  ;

            using (var file = File.Create("test.bin"))
            
                Serializer.Serialize(file, container);
            

            using (var file = File.OpenRead("test.bin"))
            
                container = Serializer.Deserialize<Container>(file);
                Debug.Assert(container.Data.Positive == 3);
            
       
    

    // Outside of the project, cannot be changed
    public interface IDummy
    
        int Positive  get; set; 
    

    [ProtoContract]
    public class Container
    
        [ProtoMember(1)]
        public IDummy Data  get; set; 
    

    public class Dummy : IDummy
    
        public int Positive  get; set; 
    

    [ProtoContract]
    class DummySurrogate
    
        [ProtoMember(1)]
        public int Negative  get; set; 

        // Does not compile : user-defined conversions to or from an interface are not allowed
        public static explicit operator IDummy(DummySurrogate value)
        
            return value == null ? null : new Dummy  Positive = -value.Negative ;
        

        // Does not compile : user-defined conversions to or from an interface are not allowed
        public static explicit operator DummySurrogate(IDummy value)
        
            return value == null ? null : new DummySurrogate  Negative = -value.Positive ;
        

        // Fake attribute, does not exist but could work if it did
        [ProtoConvertFrom]
        public static IDummy From(DummySurrogate value)
        
            return value == null ? null : new Dummy  Positive = -value.Negative ;
        

        // Fake attribute, does not exist but could work if it did
        [ProtoConvertTo]
        public static DummySurrogate To(IDummy value)
        
            return value == null ? null : new DummySurrogate  Negative = -value.Positive ;
        
    

【问题讨论】:

只想说:我不会忽视你——由于搬家,我今天的电脑时间有限。会尽快回复您 谢谢马克。祝你搬家好运。 【参考方案1】:

在当前版本中:不,没有。

但是,在下一个版本中,这可以正常工作:

[ProtoContract]
class DummySurrogate

    [ProtoMember(1)]
    public int Negative  get; set; 

    [ProtoConverter]
    public static IDummy From(DummySurrogate value)
    
        return value == null ? null : new Dummy  Positive = -value.Negative ;
    

    [ProtoConverter]
    public static DummySurrogate To(IDummy value)
    
        return value == null ? null : new DummySurrogate
            Negative = -value.Positive ;
    

基本上,标记为[ProtoConverter]static 方法优先于定义的implicitexplicit 转换运算符,另外一个优点是[ProtoConverter] 方法不受与运算符相同的语法规则的约束.没有必要定义单独的*To / *From 属性,因为从签名中可以清楚地看出意图。

附带说明:Dummy 上的属性是不必要的,从不使用。

【讨论】:

太完美了。期待下一次建设。非常感谢。弗兰克 我删除了 Dummy 上的属性以避免任何混淆。 Marc,这个版本似乎从未发布到 NuGet,是否有任何计划或者我应该从源代码构建 protobuf-net? @JulienLebosquain 我一直忙于其他事情,但我希望在下周末之前在 protobuf-net 上工作(我一直忙到周三)跨度>

以上是关于有没有办法在 protobuf-net 代理类中定义替代转换函数(从/到接口)的主要内容,如果未能解决你的问题,请参考以下文章

在 protobuf-net 中,有没有办法指定在序列化/反序列化给定类型时要使用的自定义方法?

有没有办法将 IReadOnlyCollection<T>/IReadOnlyList<T> 与 protobuf-net 一起使用

交错 protobuf-net 和文件

使用带有 protobuf-net 异常的代理对 List<T> 进行序列化

protobuf-net、版本控制和代理类型的最佳实践

具有代理和继承层次结构的 protobuf-net v3