【问题标题】:Is it possible to get a more detailed error from protobuf-net是否有可能从 protobuf-net 得到更详细的错误
【发布时间】:2017-07-10 21:11:17
【问题描述】:

是否可以从protobuf-net 获得更详细的错误信息?

我发现Channelizer 有问题,但它是一个庞大的类,我检查了好几次。

是否可以打开调试日志或任何有助于发现问题的东西?

ProtoBuf.ProtoException: Unable to resolve sub-type of: AE.DataModel.IssueStore (Intelsat.AE.OperationalDataModel.Channelizer) ---> System.InvalidOperationException: Unable to resolve sub-type of: AE.DataModel.IssueStore
   at ProtoBuf.Meta.MetaType.ApplyDefaultBehaviour()
   at ProtoBuf.Meta.RuntimeTypeModel.FindOrAddAuto(Type type, Boolean demand, Boolean addWithContractOnly, Boolean addEvenIfAutoDisabled)
   at ProtoBuf.Meta.MetaType.ApplyDefaultBehaviour()
   at ProtoBuf.Meta.RuntimeTypeModel.FindOrAddAuto(Type type, Boolean demand, Boolean addWithContractOnly, Boolean addEvenIfAutoDisabled)
   at ProtoBuf.Meta.MetaType.ApplyDefaultBehaviour()
   at ProtoBuf.Meta.RuntimeTypeModel.FindOrAddAuto(Type type, Boolean demand, Boolean addWithContractOnly, Boolean addEvenIfAutoDisabled)
   at ProtoBuf.Meta.RuntimeTypeModel.GetKey(Type type, Boolean demand, Boolean getBaseKey)
   --- End of inner exception stack trace ---
   at ProtoBuf.Meta.RuntimeTypeModel.GetKey(Type type, Boolean demand, Boolean getBaseKey)
   at ProtoBuf.Meta.ValueMember.TryGetCoreSerializer(RuntimeTypeModel model, DataFormat dataFormat, Type type, WireType& defaultWireType, Boolean asReference, Boolean dynamicType, Boolean overwriteList, Boolean allowComplexTypes)
   at ProtoBuf.Meta.ValueMember.BuildSerializer()
   at ProtoBuf.Meta.MetaType.BuildSerializer()
   at ProtoBuf.Meta.MetaType.get_Serializer()
   at ProtoBuf.Meta.RuntimeTypeModel.Serialize(Int32 key, Object value, ProtoWriter dest)
   at ProtoBuf.Meta.TypeModel.SerializeCore(ProtoWriter writer, Object value)
   at ProtoBuf.Meta.TypeModel.Serialize(Stream dest, Object value, SerializationContext context)
   at ProtoBuf.Serializer.Serialize[T](Stream destination, T instance)
enter code here

更新

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class Channelizer : UniqueDataAccessBase, IChannelizer
{
    public Channelizer()
    {
        this.ReceivePorts = new Dictionary<string, ChannelizerReceivePort>();
        this.TransmitPorts = new Dictionary<string, ChannelizerTransmitPort>();
        this.LimiterPowerMargins = new List<LimiterPowerMargin>();
    }

    public Dictionary<string, ChannelizerReceivePort> ReceivePorts { get; set; }

    public Dictionary<string, ChannelizerTransmitPort> TransmitPorts { get; set; }

    public double InputPortPowerMaxWarning { get; set; }

    public double InputPortPowerMaxError { get; set; }

    public double OutputPortPowerMaxWarning { get; set; }

    public double OutputPortPowerMaxError { get; set; }

    public double MaxGain { get; set; }

    public double SalcDeltaMarg { get; set; }

    public double SalcRange { get; set; }

    public double RefFrontEndlossAvg { get; set; }

    public double RefBackEndlossAvg { get; set; }

    public List<LimiterPowerMargin> LimiterPowerMargins { get; set; }
}

UniqueDataAccessBase

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
[ProtoInclude(10000, "AE.OperationalDataModel.AdjacentCarrierCommon")]
[ProtoInclude(10200, "AE.OperationalDataModel.AdjacentTransmitEarthStationAntenna")]
[ProtoInclude(10300, "AE.OperationalDataModel.AdjacentConnectivityLink")]
[ProtoInclude(10400, "AE.OperationalDataModel.Amplifier")]
[ProtoInclude(10500, "AE.OperationalDataModel.AmplifierModel")]
[ProtoInclude(10600, "AE.OperationalDataModel.Beam")]
[ProtoInclude(10700, "AE.OperationalDataModel.Block")]
[ProtoInclude(10800, "AE.OperationalDataModel.BlockLeg")]
[ProtoInclude(10900, "AE.OperationalDataModel.Device")]
[ProtoInclude(11000, "AE.OperationalDataModel.Carrier")]
[ProtoInclude(11100, "AE.OperationalDataModel.CarrierDestination")]
[ProtoInclude(11200, "AE.OperationalDataModel.CarrierDownlink")]
[ProtoInclude(11300, "AE.OperationalDataModel.Network")]
[ProtoInclude(11400, "AE.OperationalDataModel.Channelizer")]
[ProtoInclude(11500, "AE.OperationalDataModel.Connection")]
[ProtoInclude(11600, "AE.OperationalDataModel.ConnectivityLink")]
[ProtoInclude(11700, "AE.OperationalDataModel.EarthStationAntenna")]
[ProtoInclude(11800, "AE.OperationalDataModel.EarthStationAntenna")]
[ProtoInclude(11900, "AE.OperationalDataModel.PayloadChain")]
[ProtoInclude(12000, "AE.OperationalDataModel.Satellite")]
[ProtoInclude(12200, "AE.OperationalDataModel.SubChannel")]
[ProtoInclude(12300, "AE.OperationalDataModel.Switch")]
[ProtoInclude(12400, "AE.OperationalDataModel.TransmissionParameter")]
[ProtoInclude(12500, "AE.OperationalDataModel.Channel")]
[ProtoInclude(12600, "AE.OperationalDataModel.ChannelizerPort")]
public class UniqueDataAccessBase : IssueStore, IUniqueDataAccessBase
{
    public UniqueDataAccessBase()
        : this("Id")
    {
    }

    public UniqueDataAccessBase(string idPropName)
    {
        this.Id = Constants.NullString;
        this.IdPropertyName = idPropName;
    }

    public DatabaseCompletion DatabaseCompletionMethod { get; set; }

    public string Id { get; set; } // tdb_amp_id

    public string IdPropertyName { get; set; }
}

ChannelizerReceivePort

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
public class ChannelizerReceivePort : ChannelizerPort
{
    public ChannelizerReceivePort()
    {
        this.Channels = new List<ReceiveChannel>();
        this.Measurements = new List<ChannelizerReceivePortMeasurement>();
    }

    public List<ReceiveChannel> Channels { get; set; }

    public List<ChannelizerReceivePortMeasurement> Measurements { get; set; }
}

ChannelizerPort

[ProtoContract]
[ProtoInclude(100, typeof(ChannelizerReceivePort))]
[ProtoInclude(200, typeof(ChannelizerTransmitPort))]
public abstract class ChannelizerPort : UniqueDataAccessBase, IChannelizerPort
{
}

UniqueDataAccessBase

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
[ProtoInclude(10000, "AE.OperationalDataModel.AdjacentCarrierCommon")]
[ProtoInclude(10200, "AE.OperationalDataModel.AdjacentTransmitEarthStationAntenna")]
[ProtoInclude(10300, "AE.OperationalDataModel.AdjacentConnectivityLink")]
[ProtoInclude(10400, "AE.OperationalDataModel.Amplifier")]
[ProtoInclude(10500, "AE.OperationalDataModel.AmplifierModel")]
[ProtoInclude(10600, "AE.OperationalDataModel.Beam")]
[ProtoInclude(10700, "AE.OperationalDataModel.Block")]
[ProtoInclude(10800, "AE.OperationalDataModel.BlockLeg")]
[ProtoInclude(10900, "AE.OperationalDataModel.Device")]
[ProtoInclude(11000, "AE.OperationalDataModel.Carrier")]
[ProtoInclude(11100, "AE.OperationalDataModel.CarrierDestination")]
[ProtoInclude(11200, "AE.OperationalDataModel.CarrierDownlink")]
[ProtoInclude(11300, "AE.OperationalDataModel.Network")]
[ProtoInclude(11400, "AE.OperationalDataModel.Channelizer")]
[ProtoInclude(11500, "AE.OperationalDataModel.Connection")]
[ProtoInclude(11600, "AE.OperationalDataModel.ConnectivityLink")]
[ProtoInclude(11700, "AE.OperationalDataModel.EarthStationAntenna")]
[ProtoInclude(11800, "AE.OperationalDataModel.EarthStationAntenna")]
[ProtoInclude(11900, "AE.OperationalDataModel.PayloadChain")]
[ProtoInclude(12000, "AE.OperationalDataModel.Satellite")]
[ProtoInclude(12200, "AE.OperationalDataModel.SubChannel")]
[ProtoInclude(12300, "AE.OperationalDataModel.Switch")]
[ProtoInclude(12400, "AE.OperationalDataModel.TransmissionParameter")]
[ProtoInclude(12500, "AE.OperationalDataModel.Channel")]
[ProtoInclude(12600, "AE.OperationalDataModel.ChannelizerPort")]
public class UniqueDataAccessBase : IssueStore, IUniqueDataAccessBase
{
    public UniqueDataAccessBase()
        : this("Id")
    {
    }

    public UniqueDataAccessBase(string idPropName)
    {
        this.Id = Constants.NullString;
        this.IdPropertyName = idPropName;
    }

    public DatabaseCompletion DatabaseCompletionMethod { get; set; }

    public string Id { get; set; }

    public string IdPropertyName { get; set; }
}

问题商店

[ProtoContract(ImplicitFields = ImplicitFields.AllPublic)]
[ProtoInclude(10100, "AE.DataModel.DataAccessBase")]
[ProtoInclude(10200, "AE.Common.Model.UniqueDataAccessBase")]
[ProtoInclude(10400, "AE.Common.Model.UniqueDataAccessBase")]
[ProtoInclude(10500, "AE.OperationalDataModel.BeamBwSegment")]
[ProtoInclude(10600, "AE.OperationalDataModel.FrequencyRange")]
public class IssueStore : IIssueStore, IStateChecker
{
    public IssueStore()
    {
        this.Issues = new List<Error>();
    }

    public List<Error> Issues { get; set; }
}

这是全图

【问题讨论】:

  • 您可以通过ProtoBuf.Meta.RuntimeTypeModel.Default.GetSchema(typeof(Channelizer))) 查看为您的类型生成的架构,也许您会发现问题。正如here 所述,Protobuf-net 没有实现调试跟踪。
  • 这意味着 [ProtoInclude] 指定了无法找到的内容。有什么代码可以看这里吗?
  • @MarcGravell 请查看更新后的问题
  • @dbc GetSchema(typeof(Chan‌nelizer)) 没有返回太多,只有Unable to resolve sub-type of: AE.DataModel.IssueStore,所以它说有问题,不多:(
  • @GSerjo 如果您不使用typeof,那么您需要使用程序集限定 名称(AQN,在Type 上可用)。或者,如果你想做一些定制的事情,IIRC 有一个内置的类型解析器 API,但我不记得我脑海中的细节。如果 AQN 方法不起作用,请大声告诉我。

标签: c# serialization protocol-buffers protobuf-net


【解决方案1】:

正如@MarcGravell 在评论中所说“如果您不使用 typeof,那么您需要使用程序集限定名称(AQN,在 Type 上可用)。”

所以,尝试使用

  1. typeof,如果不可能的话goto 2

  2. 使用程序集限定名,可以从typeof(int).Type获取

顺便说一句:请确保您使用的是最新版本。 protobuf-net 2.3.0 是调试友好的版本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2012-04-21
    相关资源
    最近更新 更多