mirror of
https://github.com/ZuneDev/MicrosoftIris.git
synced 2026-07-27 13:13:29 -07:00
Convert objects that otherwise can't be serialized, to strings
This commit is contained in:
@@ -0,0 +1,30 @@
|
|||||||
|
using System;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
|
|
||||||
|
namespace Microsoft.Iris.Debug;
|
||||||
|
|
||||||
|
internal class FallbackSerializer : ISerializationSurrogate
|
||||||
|
{
|
||||||
|
public void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
|
||||||
|
{
|
||||||
|
info.AddValue("ToString", obj?.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public object SetObjectData(object obj, SerializationInfo info, StreamingContext context, ISurrogateSelector selector)
|
||||||
|
{
|
||||||
|
return info.GetString("ToString");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class FallbackSurrogateSelector : SurrogateSelector
|
||||||
|
{
|
||||||
|
public override ISerializationSurrogate GetSurrogate(Type type, StreamingContext context, out ISurrogateSelector selector)
|
||||||
|
{
|
||||||
|
selector = this;
|
||||||
|
|
||||||
|
if (type.Attributes.HasFlag(System.Reflection.TypeAttributes.Serializable))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return new FallbackSerializer();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ using NetMQ;
|
|||||||
using NetMQ.Sockets;
|
using NetMQ.Sockets;
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.Serialization.Formatters.Binary;
|
using System.Runtime.Serialization;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace Microsoft.Iris.Debug;
|
namespace Microsoft.Iris.Debug;
|
||||||
@@ -11,6 +11,7 @@ namespace Microsoft.Iris.Debug;
|
|||||||
public class ZmqDebuggerClient : IDebuggerClient, IDisposable
|
public class ZmqDebuggerClient : IDebuggerClient, IDisposable
|
||||||
{
|
{
|
||||||
private readonly SubscriberSocket _subSocket;
|
private readonly SubscriberSocket _subSocket;
|
||||||
|
private readonly IFormatter _formatter;
|
||||||
|
|
||||||
public event EventHandler<InterpreterEntry> InterpreterStep;
|
public event EventHandler<InterpreterEntry> InterpreterStep;
|
||||||
public event Action<string> DispatcherStep;
|
public event Action<string> DispatcherStep;
|
||||||
@@ -21,6 +22,8 @@ public class ZmqDebuggerClient : IDebuggerClient, IDisposable
|
|||||||
_subSocket.Connect(connectionUri);
|
_subSocket.Connect(connectionUri);
|
||||||
_subSocket.SubscribeToAnyTopic();
|
_subSocket.SubscribeToAnyTopic();
|
||||||
|
|
||||||
|
_formatter = ZmqDebuggerServer.CreateFormatter();
|
||||||
|
|
||||||
System.Threading.Thread th = new(MessageRecieveLoop);
|
System.Threading.Thread th = new(MessageRecieveLoop);
|
||||||
th.Start();
|
th.Start();
|
||||||
}
|
}
|
||||||
@@ -38,7 +41,7 @@ public class ZmqDebuggerClient : IDebuggerClient, IDisposable
|
|||||||
case DebuggerMessageType.InterpreterOpCode:
|
case DebuggerMessageType.InterpreterOpCode:
|
||||||
{
|
{
|
||||||
using MemoryStream stream = new(bytes);
|
using MemoryStream stream = new(bytes);
|
||||||
var entry = (InterpreterEntry)new BinaryFormatter().Deserialize(stream);
|
var entry = (InterpreterEntry)_formatter.Deserialize(stream);
|
||||||
InterpreterStep?.Invoke(this, entry);
|
InterpreterStep?.Invoke(this, entry);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
using NetMQ.Sockets;
|
using NetMQ.Sockets;
|
||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Runtime.Serialization;
|
||||||
using System.Runtime.Serialization.Formatters.Binary;
|
using System.Runtime.Serialization.Formatters.Binary;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
@@ -13,19 +14,22 @@ internal class ZmqDebuggerServer : IDebuggerServer, IDisposable
|
|||||||
|
|
||||||
private readonly PublisherSocket _pubSocket;
|
private readonly PublisherSocket _pubSocket;
|
||||||
private readonly byte[][] _messageFrame = new byte[2][];
|
private readonly byte[][] _messageFrame = new byte[2][];
|
||||||
|
private readonly IFormatter _formatter;
|
||||||
|
|
||||||
public ZmqDebuggerServer(string connectionUri)
|
public ZmqDebuggerServer(string connectionUri)
|
||||||
{
|
{
|
||||||
_pubSocket = new();
|
_pubSocket = new();
|
||||||
_pubSocket.Bind(connectionUri);
|
_pubSocket.Bind(connectionUri);
|
||||||
|
|
||||||
|
_formatter = CreateFormatter();
|
||||||
|
|
||||||
Current = this;
|
Current = this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LogInterpreterOpCode(object context, Data.InterpreterEntry entry)
|
public void LogInterpreterOpCode(object context, Data.InterpreterEntry entry)
|
||||||
{
|
{
|
||||||
using MemoryStream entryStream = new();
|
using MemoryStream entryStream = new();
|
||||||
new BinaryFormatter().Serialize(entryStream, entry);
|
_formatter.Serialize(entryStream, entry);
|
||||||
|
|
||||||
SendDebuggerMessage(DebuggerMessageType.InterpreterOpCode, entryStream.ToArray());
|
SendDebuggerMessage(DebuggerMessageType.InterpreterOpCode, entryStream.ToArray());
|
||||||
}
|
}
|
||||||
@@ -50,4 +54,6 @@ internal class ZmqDebuggerServer : IDebuggerServer, IDisposable
|
|||||||
|
|
||||||
_pubSocket.SendMultipartBytes(_messageFrame);
|
_pubSocket.SendMultipartBytes(_messageFrame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static IFormatter CreateFormatter() => new BinaryFormatter(new FallbackSurrogateSelector(), new(StreamingContextStates.Remoting));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user