gpt4 book ai didi

c# - Protobuf.NET 是否处理 [OnSerializing]? "Non-public member cannot be used with full dll compilation"

转载 作者:太空宇宙 更新时间:2023-11-03 23:47:39 26 4
gpt4 key购买 nike

我正在尝试 port a project从 .NET 到用于 iOS 和 Android 的可移植类库,我有 Mono serialization issues使用 DataContractJsonSerializer,因此我将其替换为 Protobuf。

我看到很多关于 Protobuf 的问题,以及一些关于 MonoTouch 的旧文档,所以我可能/很可能做错了什么。 (如有请指正)

以下是我用 ProtoBuf.net 换出和替换 DataContractJsonSerializer 的失败尝试。

The error is that OnSeralizing is actually public, has no external dependencies, but still won't precompile

Protobuf 来源

我正在使用 latest pull from Github .

PCL 配置:

DTO 正在引用 Protobuf.NET_Portable

我正在使用 Profile 344在我的 DTO 中

示例 DTO

这个“DTO”就是我试图与 protobuf 一起使用的确切代码。它代表了我正在移植的疯狂类(class)。 (非常复杂)。我把“DTO”放在引号中是因为对象非常困惑和复杂,需要很长时间来简化和优化。

using ProtoBuf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;

namespace MonoBug
{
[ProtoContract]
[DataContract]
public abstract class GroupParameterizedSerializer2
{

[OnSerializing]
public void SerializeGroup(StreamingContext context)
{


}

}
[ProtoContract]
[DataContract]
public class SetMembershipProof2 : GroupParameterizedSerializer2
{
#region Serialization

/// <summary>
/// Serialization of a
/// </summary>
[ProtoMember(1)]
[DataMember(Name = "a", EmitDefaultValue = false, Order = 2)]
public string[] _a;

/// <summary>
/// Serialization of c
/// </summary>
[ProtoMember(2)]
[DataMember(Name = "c", EmitDefaultValue = false, Order = 3)]
public string[] _c;

/// <summary>
/// Serialization of r
/// </summary>
[ProtoMember(3)]
[DataMember(Name = "r", EmitDefaultValue = false, Order = 4)]
public string[] _r;

/// <summary>
/// Serialize a, c, r.
/// </summary>
/// <param name="context">The streaming context.</param>
[OnSerializing]
public void OnSerializing(StreamingContext context)
{

// This is a simluation ...
// existing code expects to perform calculations then proceed with serialization
List<string> t = new List<string>();
t.Add("data1");
_a = t.ToArray();

t.Clear();
t.Add("data2");
_c = t.ToArray();

t.Clear();
t.Add("data3");
_r = t.ToArray();
}

#endregion
}
}

错误

Y:\DevUtil\Protobuf>precompile "\\psf\Home\Desktop\MonoBug\Types\bin\Debug\types
.dll" -o:PortableTypes.dll -t:MonoBug
protobuf-net pre-compiler
Detected framework: .NETPortable\v4.0\Profile\Profile344
Resolved C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPor
table\v4.0\Profile\Profile344\mscorlib.dll
Resolved C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPor
table\v4.0\Profile\Profile344\System.dll
Resolved \\psf\Home\Desktop\MonoBug\Types\bin\Debug\protobuf-net.dll
Resolved C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPor
table\v4.0\Profile\Profile344\System.Runtime.Serialization.dll
Adding MonoBug.GroupParameterizedSerializer2...
Adding MonoBug.SetMembershipProof2...
Compiling MonoBug to PortableTypes.dll...
Non-public member cannot be used with full dll compilation: MonoBug.SetMembershi
pProof2.OnSerializing

^^^^^^^^

at ProtoBuf.Compiler.CompilerContext.CheckAccessibility(MemberInfo member) in
\\psf\home\Documents\Git\protobuf-net\protobuf-net\Compiler\CompilerContext.cs:
line 815
at ProtoBuf.Compiler.CompilerContext.EmitCall(MethodInfo method) in \\psf\hom
e\Documents\Git\protobuf-net\protobuf-net\Compiler\CompilerContext.cs:line 558
at ProtoBuf.Serializers.TypeSerializer.EmitInvokeCallback(CompilerContext ctx
, MethodInfo method, Boolean copyValue, Type constructType, Type type) in \\psf\
home\Documents\Git\protobuf-net\protobuf-net\Serializers\TypeSerializer.cs:line
466
at ProtoBuf.Serializers.TypeSerializer.ProtoBuf.Serializers.IProtoTypeSeriali
zer.EmitCallback(CompilerContext ctx, Local valueFrom, CallbackType callbackType
) in \\psf\home\Documents\Git\protobuf-net\protobuf-net\Serializers\TypeSerializ
er.cs:line 511
at ProtoBuf.Serializers.TypeSerializer.EmitCallbackIfNeeded(CompilerContext c
tx, Local valueFrom, CallbackType callbackType) in \\psf\home\Documents\Git\prot
obuf-net\protobuf-net\Serializers\TypeSerializer.cs:line 485
at ProtoBuf.Serializers.TypeSerializer.ProtoBuf.Serializers.IProtoSerializer.
EmitWrite(CompilerContext ctx, Local valueFrom) in \\psf\home\Documents\Git\prot
obuf-net\protobuf-net\Serializers\TypeSerializer.cs:line 343
at ProtoBuf.Meta.RuntimeTypeModel.WriteSerializers(CompilerOptions options, S
tring assemblyName, TypeBuilder type, Int32& index, Boolean& hasInheritance, Ser
ializerPair[]& methodPairs, ILVersion& ilVersion) in \\psf\home\Documents\Git\pr
otobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:line 1516
at ProtoBuf.Meta.RuntimeTypeModel.Compile(CompilerOptions options) in \\psf\h
ome\Documents\Git\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:line 1132
at ProtoBuf.Precompile.PreCompileContext.Execute() in \\psf\home\Documents\Gi
t\protobuf-net\precompile\Program.cs:line 433
at ProtoBuf.Precompile.Program.Main(String[] args) in \\psf\home\Documents\Gi
t\protobuf-net\precompile\Program.cs:line 32

最佳答案

这看起来像一个错误。该方法显然是 public - 在这种情况下,“这行不通”检测可能只是犯了一个错误。看起来不错。我会在今天晚些时候看看(我现在只有手机)。

是的:protobuf-net 确实识别并使用 [OnSerializing]

关于c# - Protobuf.NET 是否处理 [OnSerializing]? "Non-public member cannot be used with full dll compilation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27084232/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com