我想编写一个C#客户端,通过protobuf-net将字符串发送到TCP服务器(已实现)。但是,当我尝试使用protobuf-net序列化字符串时,我得到一个TypeInitializerException
“'Singleton'的类型初始化器引发了异常。”
以下是代码:
public static void TelnetConnect(string host, int port) {
...
Message msg = new Message("This is a test.");
byte[] sentbytes = msg.Serialize();
...
}
[ProtoContract]
public abstract class MessageI {
public byte[] Serialize() {
byte[] result;
using (var stream = new MemoryStream()) {
Serializer.Serialize(stream, this); //THIS LINE THROWS EXCEPTION
result = stream.ToArray();
}
return result;
}
}
[ProtoContract]
public class Message : MessageI {
[ProtoMember(1)]
public string str { get; set; }
public Message(string s) {
this.str = s;
}
}
我尝试过本网站和其他人建议的一些方法,但没有成功。我在Visual Studio 2010上使用C#。
谢谢,非常感谢您的帮助。
更新:堆栈跟踪是:
at ProtoBuf.Meta.RuntimeTypeModel.get_Default()
at ProtoBuf.Serializer.Serialize[T](Stream destination, T instance)
at PingNorbertServer.MessageI.Serialize() in C:\Users\RS88517\Documents\Visual Studio 2010\Projects\PingNorbertServer\PingNorbertServer\NorbertClient.cs:line 37
at PingNorbertServer.NorbertClient.TelnetConnect(String host, Int32 port) in C:\Users\RS88517\Documents\Visual Studio 2010\Projects\PingNorbertServer\PingNorbertServer\NorbertClient.cs:line 23
at PingNorbertServer.NorbertClient.Main(String[] args) in C:\Users\RS88517\Documents\Visual Studio 2010\Projects\PingNorbertServer\PingNorbertServer\NorbertClient.cs:line 14
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
答案 0 :(得分:1)
我无法重现它错误;您的代码,直接复制,工作正常:
static void Main()
{
var data = new Message("abc").Serialize();
}
但是,试着提供帮助:
首先,catch
Exception
,然后查看.InnerException
。大多数例外情况都有更多信息;例如:
try {
// HERE: the code that errors
} catch(Exception ex) {
while(ex != null) {
Console.Error.WriteLine(ex.Message);
ex = ex.InnerException;
}
throw;
}
其次,请注意继承模型的一个常见问题是声明继承 - 看看基类是否需要装饰,例如:
[ProtoInclude(1, typeof(Message))]
另一个观察是缺少公共无参数构造函数;现在,protobuf-net并没有坚持(事实上,它似乎将问题中的代码视为“自动元组”,并使用存在的构造函数),但是你也可以提供一个额外的(可能是非公共的)无参数构造函数:
private Message() {}
或告诉它完全跳过构造函数:
[ProtoContract(SkipConstructor = true)]
但是:不知道异常消息是什么,很难进一步推测。