Skip to main content
 首页 » 编程设计

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

2024年08月12日46bonelee

我正在尝试 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]