- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在这个函数中,我尝试在客户端反序列化 class Simulator
:
private void OnHandshakeSimulationStart(Peer peer, Message msg, int seq)
{
System.Diagnostics.Trace.WriteLine("TRY OnHandshakeSimulationStart id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
try
{
HandshakeSimulationStart simstart = msg as HandshakeSimulationStart;
if (simstart == null) OnHandshakeFailed();
System.Diagnostics.Trace.WriteLine("#1.1 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
//Simulator sim = (Simulator)simstart.SimulationState.GetObject();
Simulator sim = null;
System.Diagnostics.Trace.WriteLine("#1.2 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
try
{
// sim = (Simulator)simstart.SimulationState.GetObject();
using (MemoryStream ms = (MemoryStream)simstart.SimulationState.GetObjectWoDeserialize())
{
System.Diagnostics.Trace.WriteLine("#2.1 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
ms.Seek(0, SeekOrigin.Begin);
System.Diagnostics.Trace.WriteLine("#2.2 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
sim = Serializer.Deserialize<Simulator>(ms); //(Simulator)new BinaryFormatter().Deserialize(ms);
System.Diagnostics.Trace.WriteLine("#2.3 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
}
}
catch (SerializationException e)
{
Console.WriteLine("Failed to deserialize. Reason: " + e.Message);
}
System.Diagnostics.Trace.WriteLine("#3 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
sim.PostDeserialize();
System.Diagnostics.Trace.WriteLine("#4 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
lock (this)
{
simulator = sim;
// команды полученные до этого ставим в очередь
foreach (Commands.Command cmd in CollectedCommandsDuringHandshake)
if (cmd.tact >= simulator.tactCounter)
simulator.InternalQueue(cmd);
System.Diagnostics.Trace.WriteLine("#5 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
CollectedCommandsDuringHandshake = null;
// настраиваем сетевое время
networkTime = new Network.Timer(simulator.HZ);
// настраиваем обработчик команд
simulator.OnAfterCommand.Add(typeof(Commands.Command), new CommandHandler(OnAfterCommand));
System.Diagnostics.Trace.WriteLine("#6 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
// хендшейк закончен
OnHandshakeCompleted();
System.Diagnostics.Trace.WriteLine("#7 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
CurrentReceiveHandler = new Peer.MessageReceivedHandler(OnMessageReceivedInActiveState);
System.Diagnostics.Trace.WriteLine("#8 id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
}
}
catch (Exception exception)
{
System.Diagnostics.Trace.WriteLine("OnHandshakeSimulationStart ERROR: " + exception.Message + " id = " + +System.Threading.Thread.CurrentThread.ManagedThreadId);
}
}
通过使用 DebugView.exe 应用程序,我得到:
[26480] Client handshaked: id=0 name=ECDIS[1] version=3.8.1
[26480] ObjectWrapper(object obj) - ms.Length = 67 id = 10
[26480] Write(Network.Packet packet) - ObjectDumpProtoBuf.Length = 256 id = 10
[25404] ObjectWrapper(Network.Packet packet) - len = 256 id = 5
[25404] TRY OnHandshakeSimulationStart id = 5
[25404] #1.1 id = 5
[25404] #1.2 id = 5
[25404] GetObjectWoDeserialize() id = 5
[25404] #2.1 id = 5
[25404] #2.2 id = 5
[25404] OnHandshakeSimulationStart ERROR: Invalid field in source data: 0 id = 5
我发现在反序列化 class Simulator
期间引发了异常:
namespace Trainer
{
[Serializable]
[ProtoContract]
public class Simulator
{
[ProtoMember(1)]
public IDictionary<int, Task> tasks = new Dictionary<int, Task>();
[ProtoMember(2)]
public Workplace[] workplaces;
[ProtoMember(3)]
public int tactCounter = 0;
[ProtoMember(4)]
public int tactLimit = 0;
[NonSerialized]
public int sheduleLimit = 0;
[ProtoMember(5)]
public int HZ = 100;
public int SyncFactor { get { return 1; } } // HZ/8
public double DT { get { return 1.0 / (double)HZ; } }
[ProtoMember(6)]
List<Commands.Command> commandQueue = new List<Commands.Command>();
//Queue commandQueue = new Queue();
[NonSerialized]
public CommandEventTable OnBeforeCommand = new CommandEventTable();
[NonSerialized]
public CommandEventTable OnAfterCommand = new CommandEventTable();
public void PostDeserialize()
{
OnBeforeCommand = new CommandEventTable();
OnAfterCommand = new CommandEventTable();
foreach (Task t in tasks.Values)
t.PostDeserialize();
}
public Simulator()
{
}
//there are also a lot of functions...
}
一个对象包装器有助于序列化/反序列化,它可以很好地与 binaryformatter 一起工作,但我将其更改为使用 protobuf-net:
namespace Trainer.Network
{
[Serializable]
[ProtoContract]
public class ObjectWrapper : IFile
{
//public byte[] ObjectDump;
[ProtoMember(1)]
public byte[] ObjectDumpProtoBuf;
public ObjectWrapper(object obj)
{
using (MemoryStream ms = new MemoryStream())
{
//for protobuf-net:
Serializer.Serialize(ms, obj);
ObjectDumpProtoBuf = ms.GetBuffer();
//for binaryformatter:
//new BinaryFormatter().Serialize(ms,obj);
//ObjectDump = ms.GetBuffer();
_Guid = Guid.NewGuid();
System.Diagnostics.Trace.WriteLine("ObjectWrapper(object obj) - ms.Length = " + ms.Length + " id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
}
}
public ObjectWrapper(Network.Packet packet)
{
bool body = packet.ReadBool();
if (body)
{
int len = packet.ReadInt();
ObjectDumpProtoBuf = (byte[])packet.Read(typeof(byte), len);
//ObjectDump = (byte[])packet.Read(typeof(byte),len);
System.Diagnostics.Trace.WriteLine("ObjectWrapper(Network.Packet packet) - len = " + len + " id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
}
else
_Guid = (Guid)packet.Read(typeof(Guid));
}
public void Write(Network.Packet packet)
{
System.Diagnostics.Trace.WriteLine("Write(Network.Packet packet) - ObjectDumpProtoBuf.Length = " + ObjectDumpProtoBuf.Length + " id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
packet.Write(true);
//packet.Write((int)ObjectDump.Length);
//packet.Write(ObjectDump);
packet.Write((int)ObjectDumpProtoBuf.Length);
packet.Write(ObjectDumpProtoBuf);
}
public void WriteFileRef(Network.Packet packet)
{
packet.Write(false);
packet.Write(Guid);
}
public object GetObject()
{
//using (MemoryStream ms = new MemoryStream(ObjectDump))
using (MemoryStream ms = new MemoryStream(ObjectDumpProtoBuf))
return new BinaryFormatter().Deserialize(ms);
}
public MemoryStream GetObjectWoDeserialize()
{
System.Diagnostics.Trace.WriteLine("GetObjectWoDeserialize() id = " + System.Threading.Thread.CurrentThread.ManagedThreadId);
return new MemoryStream(ObjectDumpProtoBuf);
}
#region IFile Members
[ProtoMember(2)]
public Guid _Guid = new Guid();
public Guid Guid { get { return _Guid; } }
public byte[] Data
{
//get { return ObjectDump; }
//set { ObjectDump = value;}
get { return ObjectDumpProtoBuf; }
set { ObjectDumpProtoBuf = value; }
}
#endregion
}
问题:如何找出问题的确切位置?我的意思是“源数据中的无效字段:0”源数据 0 是什么?这是一个
[ProtoMember(1)]
public IDictionary<int, Task> tasks = new Dictionary<int, Task>();
还是不行?所以我不明白哪里出了问题......
最佳答案
开始吧:
ObjectDumpProtoBuf = ms.GetBuffer();
这为您提供了超大 后备缓冲区。如果您想避免内存复制,这很方便,但是您需要非常小心,只处理 ms.Length
字节 - 其余的都是垃圾。特别是,由于您还没有使用该内存,它会全为零...零不是有效的字段标题,并且会导致您看到的错误。
要快速检查是否是问题所在,请将其替换为:
ObjectDumpProtoBuf = ms.ToArray();
这是缓冲区中数据的大小合适副本。
如果可行,您可能想要切换为返回 ArraySegment<byte>
或类似表示超大缓冲区的部分;即
new ArraySegment<byte>(ms.GetBuffer(), 0, (int)ms.Length);
你用 BinaryFormatter
逃脱惩罚的原因是那个BinaryFormatter
知道自己的长度。 Protocol buffers 是一种可追加格式,因此它不知道自己的长度。
关于c# - 我在反序列化过程中遇到下一个异常 : "Invalid field in source data: 0". 如何找出源代码中的原因/错误位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12601164/
这些指针之间有区别吗?每次通话到底发生了什么。 *p++ (*p)++, *(p)++ 最佳答案 1和3是一样的。 请记住 ++ 的后缀和一元形式。和 --有一个结果和一个副作用: x++ 的结果是
这个问题已经有答案了: difference between grep Vs cat and grep (5 个回答) 已关闭 8 年前。 我看到一个例子,其中有人这样做: cat source.tx
它曾经有效。现在,当我添加一个断点时: saveSnippet: (title, imageUrl, role) => { debugger; ... chrome (
开发.Net Web应用程序时,如果生成运行时错误,则会显示一些在Exception类中找不到的“额外”调试信息。 它显示了“源错误”部分,其中显示了代码摘录,其中行号准确显示了错误的产生位置,并显示
Firefox 中的“源”和“生成的源”有什么区别? 请举例说明。 编辑: 7 月 3 日 “搜索引擎”使用哪个来源,生成的还是生成前的? 最佳答案 Source 将显示页面加载的源(由服务器提供)。
对于具有两个不同工作表的Excel文件,我有两个OLE DB源。工作表A和工作表B。工作表A单元格I6包含日期,我想组合这两个源并在工作表B中添加一列,以将该值设置为工作表A的日期值。有可能做到吗?任
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
这是我的代码: import speech_recognition as sr r = sr.Recognizer() with sr.Microphone() as source: prin
我是 mysql 新手。我正在尝试 setter 工示例数据库 我尝试了 stackoverflow 中提到的一些方法,但没有帮助 谁能告诉我如何解决这个问题 SELECT 'LOADING depa
在终端中,我启动程序如下: 1) source env.sh 2) source activate enviroment 3) program --args 除了在 Pycharm 中并调试代码之外,
IntelliJ 如何知道目录是“源”还是“测试源”?如何始终将目录标记为“测试源”? build.gradle 1 apply plugin: 'java' apply plugin: 'idea'
这个问题类似于Source script to separate environment in R, not the global environment , 但有一个关键的转折。 考虑一个源另一个脚
和有什么区别--devtool source-map & eval-source-map ? 最佳答案 webpack 文档有一个方便的图表,说明这些不同的选项可能适合哪些情况。 他们显示eval-s
这个问题已经有答案了: Issue with virtualenv - cannot activate (36 个回答) 已关闭 4 年前。 venv) C:\Users\Sunil\PycharmP
在以前版本的 Akka Streams 中,groupBy 返回一个 Source 的 Source 可以具体化为一个 Source[Seq [A]]. 在 Akka Streams 2.4 中,我看
这个问题已经有答案了: Issue with virtualenv - cannot activate (36 个回答) 已关闭 4 年前。 venv) C:\Users\Sunil\PycharmP
是否可以获取 Bash 片段的源代码,但仅在特定条件成立时才实际提供其中的函数? 所以我要问的是,我可以无条件地获取目录中的所有文件,但获取的文件包含是否向采购外壳提供功能的逻辑。 例子: .bash
我无法查看 JavaCore.class 源代码,但我可以很好地使用代码。 例如,要查看方法JavaCore.create(..) 的源代码,我ctrl - click(或按f3) 在 JavaCor
-- Sample employee database -- See changelog table for details -- Copyright (C) 2007,2008, MySQL
当我在我的 IDE 中编译项目时它工作正常但是当我在 bamboo 中编译时它给我以下错误。 我已经检查过我在任务中配置的 jdk 版本是 1.6,我还尝试从 pom 中的 maven 插件强制执行
我是一名优秀的程序员,十分优秀!