- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的 2 个类中工作时看起来像这样(最小)
using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
using ProtoBuf;
namespace Sandbox
{
public partial class Form1 : Form
{
public Form1()
{
Family family = new Family();
Child child1 = new Child(1);
Child child2 = new Child(2);
Parent parent = new Parent(new List<Child>() { child1, child2 });
family.Add(parent);
string file = "sandbox.txt";
try { File.Delete(file); } catch { }
using (var fs = File.OpenWrite(file)) { Serializer.Serialize(fs, family); }
using (var fs = File.OpenRead(file)) { family = Serializer.Deserialize<Family>(fs); }
System.Diagnostics.Debug.Assert(family != null, "1. Expect family not null, but not the case.");
}
}
[ProtoContract()]
public class Child
{
[ProtoMember(1, AsReference = true)]
internal Parent Parent;
private Child() { }
public Child(int i) { }
}
[ProtoContract()]
public class Parent
{
[ProtoMember(1)]
protected List<Child> m_Children;
/// <summary>
/// ProtoBuf deserialization constructor (fails here)
/// </summary>
private Parent() { m_Children = new List<Child>(); }
public Parent(List<Child> children)
{
m_Children = children;
m_Children.ForEach(x => x.Parent = this);
}
}
[ProtoContract()]
public class Family
{
[ProtoMember(1)]
protected List<Parent> m_Parents;
public void Add(Parent parent)
{
m_Parents.Add(parent);
}
public Family()
{
m_Parents = new List<Parent>();
}
}
}
在反序列化过程中,我遇到异常“No parameterless constructor defined for this object”。用于在附近的 ProtoBuf.BclHelper 中创建 Parent 对象
case FieldObject:
// ...
value = ((options & NetObjectOptions.UseConstructor) == 0) ? BclHelpers.GetUninitializedObject(type) : Activator.CreateInstance(type);
然后当我将默认构造函数 Parent() 更改为 public 时,异常消失了。
知道
我可能忽略了
在这种情况下 AsRerference 的正确用法吗?
赏金:虽然 Marc 花时间解决了这个问题,但我需要一个明确的解决方案来在这种情况下使用 protobuf-net,通过 protobuf-net 属性、方法或其他技巧来解决。否则我将不得不完全放弃使用 protobuf-net。感谢您的帮助。
最佳答案
我相信你可以这样做来解决这个问题:
[ProtoContract(SkipConstructor = true)]
public class Parent
{
[ProtoMember(1)]
protected List<Child> m_Children;
private Parent() { Initialize(); }
[ProtoBeforeDeserialization] // could also use OnDeserializing
private void Initialize()
{
m_Children = new List<Child>();
}
public Parent(List<Child> children)
{
m_Children = children;
m_Children.ForEach(x => x.Parent = this);
}
关于c# - ProtoBuf-net AsReference 需要 Activator.CreateInstance 中的公共(public)构造函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7219959/
这些调用有什么区别? 最佳答案 没有。 Assembly.CreateInstance 实际上在幕后调用了 Activator.CreateInstance。 在 Assembly.CreateIns
1)如果我们想在运行时创建给定类型的实例(因此使用后期绑定(bind)),那么我们需要调用 Activator.CreateInstance。但是如果Type类有这样的方法不是更高效吗?如果不出意外,
我想问一个问题来了解AppDomain和Activator之间的区别,我通过appdomain.CreateInstance加载了我的dll。但我意识到更多的方法来创建实例。因此,我何时何地选择这种方
这些调用有什么区别? 最佳答案 没有。 Assembly.CreateInstance 实际上在幕后调用了 Activator.CreateInstance。 在 Assembly.CreateIns
不,这不是关于泛型的问题。 我有一个工厂模式,其中包含几个带有内部构造函数的类(如果不通过工厂,我不希望它们被实例化)。 我的问题是 CreateInstance 失败并出现“没有为此对象定义无参数构
如果这个问题已经被问过和回答过,请原谅我。 给定一个类型为 T 的类,下面的区别是什么? T myObj = Activator.CreateInstance(); T myObj = typeof(
我正在尝试将插件系统与 .NET 放在一起,但我不确定我是否正确地做。系统的基础是一个特定的目录({apppath}/Plugins/)会有一堆预编译的DLL,我想用反射查看每一个,对于每个可用的类,
我需要获取 DataContext 的子类,我在某处找到了下面的函数,它确实找到了我的子类,但我无法实例化它:( public static IEnumerable GetSubclassesFo
这是我的构造函数: CMSATools::CMSATools() { m_pInterface = NULL; HRESULT hr; hr = m_pInterface.Cr
当我们使用 AppDomain.CreateInstance("Assembly name", Type name) 我的类继承自 MarshalByRefObject 内部发生了什么?它是否创建了一
我做了以下创建接口(interface)实例的方法。 static IFBIndexItem* CreateFBIndexItemPtr() { IFBIndexItemPtr pFBComW
我一直在我的一些代码中使用 Activator.CreateInstance()。使用它创建实例有任何风险吗? 最佳答案 好吧,你的代码存在弱类型的风险,你不会发现你不小心尝试将它与一个直到执行时才没
我想我缺乏了解,究竟发生了什么: 用户可以输入程序集的路径和对象类型,然后我尝试创建它的实例。 我的做法: Assembly a = Assembly.LoadFile(txtAsse
什么是System.Activator.CreateInstance,什么时候应该使用它? 最佳答案 它允许您创建其类型仅在运行时已知的对象的实例。因此,假设您有一些类(class) public c
有谁知道如何使用只有 1 个可选参数的构造函数来实例化一个类? 我都试过了 (T)Activator.CreateInstance(typeof(T), new object[] { Type.Mis
我们有一些使用 MSXML 的代码,这样做是为了创建 XML 文档对象: MSXML2::IXMLDOMDocumentPtr doc_in; doc_in.CreateInstance("Msxm
使用这段代码: public static class ChocolateFactory { private static Func Func { get; set; } static
我想将变量从一种形式传递到另一种形式。 这是 form2 中的构造函数: public Form2 (int getId,string getText) 在 form1 中我试图像这样传递变量 var
Activator.CreateInstance 和工厂有什么区别?它们可以互换使用吗?或者我们还需要工厂模式吗? 最佳答案 Activator.CreateInstance是一个静态方法,它使用该类
拥有Remember.cs: namespace Tasks { public class Remember : Task { new public string na
我是一名优秀的程序员,十分优秀!