在将消息反序列化为 undefined 对象时遇到一些麻烦。我将其称为未定义对象,因为我没有任何类似于消息数据的适当类。我只有一个界面。 由于我要处理的项目比较繁琐,因此除非您觉得有必要询问,否则我不会显示每一行代码。
我有一个接口,我们称它为ITest(它本身实现了其他接口和其他类。因此这是一个非常复杂的接口)
在我的范围内,我收到一个完全按照此接口ITest模式使用JsonConvert序列化的“消息”。 我不会详细介绍它实际上是如何序列化的,但是该解决方案不能用于反序列化方面。。问题来了:
由于我必须将此消息反序列化到界面中,所以……我显然不能。因此,我尝试了许多(许多)解决方法。使用其他Nuget(例如“ Impromptu接口”或Castle.Core),甚至自动将我的接口映射为Object类型(动态),但是代码无法编译,或者我只能获取一半的数据,或者只能获取具有null / 0值的属性。我最接近的是Impromptu ...我现在有点绝望。
我不想让那些该死的混凝土类型。因为我需要很多。 DRY概念正在流血rn:(
这是即兴表演
var obj = ActLike<ITest>(message)
这是自动映射
public interface ITest
{
string Test { get; set; }
int Val { get; set; }
}
static void Main(string[] args)
{
Mapper.Initialize(cfg => { });
var a = new { Test = "test", Val = 1 };
ITest b = Mapper.Map(a, typeof(Object), typeof(ITest)) as ITest;
}
我在哪里尝试将该死的“ var a”更改为动态Json对象,以用于映射。还有很多其他事情...
是的...我现在有点卡住了。
谢谢您能给我的帮助!
答案 0 :(得分:0)
我可能缺少问题的一部分,但这可能是一个选择。在序列化对象中添加一些类型信息。
static void Main(string[] args)
{
var objectToSerialize = new List<IFoo>() {
new TestClass()
{
Test = "A",
Test2 = "B"
},
new TestClass2()
{
Test = "C",
Test3 = "D"
},
};
// TODO: Add objects to list
var jsonString = JsonConvert.SerializeObject(objectToSerialize, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
var deserializedObject = JsonConvert.DeserializeObject<List<IFoo>>(jsonString, new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto });
var result = deserializedObject;
}
}
internal interface IFoo
{
string Test { get; set; }
}
public class TestClass : IFoo
{
public string Test { get; set; }
public string Test2 { get; set; }
}
public class TestClass2 : IFoo
{
public string Test { get; set; }
public string Test3 { get; set; }
}
答案 1 :(得分:0)
我有点找到了使用MassTransit代理系统的解决方案:
JsonSerializer jsonMessageDeserializer = JsonMessageSerializer.Deserializer;
Type type = typeof(T);
if (type.IsInterface && TypeMetadataCache.IsValidMessageType(type))
type = TypeMetadataCache.GetImplementationType(type);
using (Stream body = new MemoryStream(Encoding.UTF8.GetBytes(message)))
using (StreamReader streamReader = new StreamReader(body, Encoding.UTF8, false, 1024, true))
using (JsonTextReader jsonTextReader = new JsonTextReader((TextReader)streamReader))
{
Object objBody = jsonMessageDeserializer.Deserialize((JsonReader)jsonTextReader);
JsonReader r = ((JsonReader)new JTokenReader(GetMessageToken((objBody))));
object obj2 = jsonMessageDeserializer.Deserialize(r, type);