使用非标准构造函数序列化和反序列化对象 - protobuf-net
Posted
技术标签:
【中文标题】使用非标准构造函数序列化和反序列化对象 - protobuf-net【英文标题】:Serialize and deserialize Object with non standard constructor - protobuf-net 【发布时间】:2013-08-30 10:52:07 【问题描述】:我有一个对象
没有设置 Serializable 属性 有属性,谁的类型,没有设置Serializable属性 我无法控制(意味着我无法编辑课程)我尝试阅读 THIS,它谈到了使用 Sharpserializer 时解决此问题的替换类,但坦率地说,当我不知道我的对象的属性时,我不明白如何做到这一点。
是否有一些序列化框架可以做到这一点?
编辑:我正在研究 protobuf.net 我不知道如何让它在我的场景中工作 - 我希望 Marc 能够挽救这一天? :) - 我读了this,这与我的问题完全相同,但我仍然得到 “类型不是预期的,无法推断出任何合同” 使用时
private static byte[] ClienToBytes(IScsClient client)
using (var memoryStream = new MemoryStream())
RuntimeTypeModel.Default.Add(typeof(IScsClient), true).SetSurrogate(typeof(BinaryFormatterSurrogate<IScsClient>));
Serializer.Serialize(memoryStream, client);
return memoryStream.ToArray();
我是否使用了 RunTimeTypeModel 错误?
【问题讨论】:
IScsClient
是接口吗?还是一堂课?或者更好:您是否有一个可运行示例(即使它实际上不起作用)来说明您想要做什么?
耶! - 我认为 IScsClient 是一个类(可能是错误的命名?) - 我可以从中创建一个对象(我可以使用接口执行此操作吗?),它具有诸如 IscsWireProtocol WireProtocol 之类的属性 - 这是我想要序列化和反序列化的,因为它有一些我稍后需要的连接属性。我确实有我想做的可运行测试
具体实现是否“明显”(对于“明显”的某些值)?或者更好:你能分享IScsClient
的声明和任何具体的实现吗? (如果你因为某种原因不能把它放在这里,通过电子邮件会有所帮助)
IScsClient Client = ScsClientFactory.CreateClient(new ScsTcpEndPoint("160.209.1.100",10666));这与 IcsClient 的来源一样具体 -> codeproject.com/Articles/155282/…
那么:protobuf-net 也不能(至少,不是以任何理智的方式);它不是内部状态序列化器。我建议考虑一下配置系统所需的数据;仅序列化数据,然后单独将其映射到实现。目前,我的回答是“不,这不合适”
【参考方案1】:
我会尝试 protobuf-net。看看这里: http://code.google.com/p/protobuf-net/
来自网站的报价:
protocol buffers 是 Google 用于其大部分数据通信的二进制序列化格式的名称。它的设计目的是:
体积小——高效的数据存储(远小于xml) 处理成本低 - 无论是在客户端还是服务器上 平台无关 - 可在不同的编程架构之间移植 可扩展 - 将新数据添加到旧消息中
【讨论】:
我也研究过这个,但使用非自定义、非本地类似乎并不容易 但是您可以为手头没有源代码的错字添加序列化程序,例如:RuntimeTypeModel.Default.Add(typeof(Point), false).Add("X", "Y");
但我无法将类型标记为合同? - 我不需要这样做吗?
您不必修改类。 Point 类来自命名空间 System.Drawing.Point,并且没有为它定义开箱即用的序列化程序。
你有使用 RuntimeTypeModel 的例子吗?以上是关于使用非标准构造函数序列化和反序列化对象 - protobuf-net的主要内容,如果未能解决你的问题,请参考以下文章