没有为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 / SomeTypeThatYouOwnPSObject基本上是一个属性包,由于protobuf不包含任何元数据(你需要提前知道数据的形状以便有意义地反序列化),因此它不能很好地工作。