没有为Protobuf-net中的类型:System.Management.Automation.PSObject定义的序列化程序
这是我的class级
[ProtoContract] internal class Powershellresults { internal Powershellresults() { } [ProtoMember(1)] public Collection PsObjects { get; set; } [ProtoMember(2)] public string Script { get; set; } [ProtoMember(3)] public string Viewname { get; set; } }
但我得到没有为类型定义序列化程序:System.Management.Automation.PSObject当我尝试序列化它
private byte[] SerializeResults(Powershellresults obj) { byte[] data; using (var ms = new MemoryStream()) { ProtoBuf.Serializer.Serialize(ms, obj); data = ms.ToArray(); ; } return data; }
PsObject是System.Management.Automation的一部分
我可以绕过这个并实际序列化这个集合吗?
更新:通过添加到我的序列化方法
RuntimeTypeModel.Default.Add(typeof(PSObject), true);
我可以让它序列化 – 但是一旦序列化它就失去了它的大部分字段我如何让它“克隆”原始对象,以便保留它的所有字段和属性?
编辑
我想到了! 我心里想,Powershell必须能够序列化它的对象,因为你可以轮询远程机器 – 它如何能够在机器之间发送PSObject – 它确实如此! (哇噢!!!!)
好吧,我发现了一篇描述这个的文章,并找到了我的关键字System.Management.Automation.PSSerializer
Collection PSCol = Powershell.Invoke(); string SerializedCollection = PSSerializer.Serialize(PSCol);
//序列化到XML完成!
然后使用Protobuf-net或任何时候序列化字符串……
反序列化有点尴尬,但反序列化使用非常简单:使用Protobuf反序列化字符串,然后……
PSObject obj = PSSerializer.Deserialize(DeserializedString) as PSObject; Collection DeserializedCollection = new Collection(((ArrayList)obj.ImmediateBaseObject).Cast().ToArray());
这就是..
我想到了! 我心里想,Powershell必须能够序列化它的对象,因为你可以轮询远程机器 – 它如何能够在机器之间发送PSObject – 它确实如此! (哇噢!!!!)
好吧,我发现了一篇描述这个的文章,并找到了我的关键字System.Management.Automation.PSSerializer
Collection PSCol = Powershell.Invoke(); string SerializedCollection = PSSerializer.Serialize(PSCol);
//序列化到XML完成!
然后使用Protobuf-net或任何时候序列化字符串……
反序列化有点尴尬,但反序列化使用非常简单:使用Protobuf反序列化字符串,然后……
PSObject obj = PSSerializer.Deserialize(DeserializedString) as PSObject; Collection DeserializedCollection = new Collection (((ArrayList)obj.ImmediateBaseObject).Cast ().ToArray());
这就是..
PSObject
太模糊了,不能成为一个好的序列化候选者(尤其是它是一个dynamic
提供者等); 我强烈建议您构建一个定义良好的 DTO模型,即
[ProtoMember(1)] public Collection Items {get;set;}
其中SomeTypeThatYouOwn
具有有意义的属性等。您始终可以转换为/从SomeTypeThatYouOwn
接近serialize / SomeTypeThatYouOwn
。 PSObject
基本上是一个属性包,由于protobuf不包含任何元数据(你需要提前知道数据的形状以便有意义地反序列化),因此它不能很好地工作。