如何获得将在当前状态下重新创建运行时对象的等效C#代码?

如何获得将在当前状态下重新创建运行时对象的等效C#代码?,c#,serialization,C#,Serialization,是否有任何.Net库可以获取对象并将其序列化为流,如创建该对象的C#代码 Stream fs = ...; CSharpFormatter formatter = new CSharpFormatter(); var p = new Person { Name = "Russ", Address = "1024 Oak St" }; formatter.Serialize(fs, p); 最后,fs将以这样的字符串结尾: new Person { Name = "Russ", Addre

是否有任何.Net库可以获取对象并将其序列化为流,如创建该对象的C#代码

Stream fs = ...;

CSharpFormatter formatter = new CSharpFormatter();

var p = new Person { Name = "Russ", Address = "1024 Oak St" };

formatter.Serialize(fs, p);
最后,fs将以这样的字符串结尾:

new Person { Name = "Russ", Address = "1024 Oak St" };

我认为这样的东西在从复杂的运行时案例编写单元测试时会非常有用。

您可能会通过破解JSON序列化程序来实现这一点。给定Person对象,JSON序列化程序可能会返回以下内容:

{"name":"Russ","Address":"1024 Oak St"}
从这里开始,使用
Split()
Replace()
可以非常简单地接近您想要的:

{ Name = "Russ", Address = "1024 Oak St" }

剩下的只是粉饰而已。

您可能会破解一个JSON序列化程序来实现这一点。给定Person对象,JSON序列化程序可能会返回以下内容:

{"name":"Russ","Address":"1024 Oak St"}
从这里开始,使用
Split()
Replace()
可以非常简单地接近您想要的:

{ Name = "Russ", Address = "1024 Oak St" }

剩下的只是粉饰。

只是部分答案,但您可以使用命名空间中的类来创建代码,例如,然后在类中使用GenerateCodeFromXXX方法来发出C#


另一种方法是使用,例如。和反射,但它需要Visual Studio。

只有部分答案,但您可以使用命名空间中的类来创建代码,例如,然后在类中使用GenerateCodeFromXXX方法来发出C


另一种方法是使用,例如。和反射,但它需要Visual Studio。

我需要一张图片来生成代码。想象一下,当我发现一个异常情况时,我可以立即将参与的对象序列化为字符串。。。然后将该字符串粘贴到新的单元测试中。是的,我可以使用BinaryFormatter、XML或JSON。但我非常喜欢在可能的情况下编写C#代码。你的意思是序列化不可序列化的对象吗?我对需要DataContract或可序列化标记没有任何问题。我只希望输出是C代码,例如,我可以将其放入单元测试中。使用一些反射,这应该不会太难实现。但是像是新的人{Name=“Russ”,Address=“1024 Oak St”}要求所有字段或道具都是公共的,将任意obj转换成这种形式不能称为无损序列化。一个没有公共道具的班级怎么样?对于那些封装良好的类,这种准序列化是毫无意义的。这听起来是一个非常糟糕的主意。在将来的某个时候,你会想用一个完整的C#解析器来反序列化它,它会允许用户通过这些对象流来做一些危险的意外事情。想象一下,当我发现一个异常情况时,我可以立即将参与的对象序列化为字符串。。。然后将该字符串粘贴到新的单元测试中。是的,我可以使用BinaryFormatter、XML或JSON。但我非常喜欢在可能的情况下编写C#代码。你的意思是序列化不可序列化的对象吗?我对需要DataContract或可序列化标记没有任何问题。我只希望输出是C代码,例如,我可以将其放入单元测试中。使用一些反射,这应该不会太难实现。但是像是新的人{Name=“Russ”,Address=“1024 Oak St”}要求所有字段或道具都是公共的,将任意obj转换成这种形式不能称为无损序列化。一个没有公共道具的班级怎么样?对于那些封装良好的类,这种准序列化是毫无意义的。这听起来是一个非常糟糕的主意。在将来的某个时候,你会希望使用一个完整的C#解析器对其进行反序列化,它将允许用户通过这些对象流执行危险的意外操作。JSON将无法像二进制格式化程序那样处理我的对象结构中的循环。如果这个CSharpSerializer能够处理复杂的场景就好了。我在单元测试中使用了两种静态实用程序方法,
ToXml
FromXml
。当我想重新创建一个特定的对象时,我会执行
ToXml
Debug.Print
,然后将生成的XML复制/粘贴到
FromXml
调用中。JSON将无法像二进制格式化程序那样处理对象结构中的循环。如果这个CSharpSerializer能够处理复杂的场景就好了。我在单元测试中使用了两种静态实用程序方法,
ToXml
FromXml
。当我想重新创建一个特定对象时,我会执行
ToXml
Debug.Print
,然后将生成的XML复制/粘贴到
FromXml
调用中。