【问题标题】:Deserialize into self in constructor在构造函数中反序列化为 self
【发布时间】:2012-10-19 11:56:03
【问题描述】:

我想要一个构造函数,它接受一个包含 JSON 对象的文件名

我的目录中包含 JSON 对象(作为文本)

我想要:

Public Sub New(filename as string)
   Dim JSONString As String = File.ReadAllText(filename)
   Dim j As New JavaScriptSerializer()
   Dim o As Object = j.DeserializeObject(JSONString)
   Me = o
End Sub

显然我不能做Me = o这一行。

我想知道人们能想出什么技巧。我是否只需将对 New Profile(...) 的所有调用替换为静态方法?你会怎么做?

我有一堆旧的对接受字符串的构造函数的调用,我希望它们使用新机制。

【问题讨论】:

  • 你到底想用这个 JSON 对象做什么?是单个变量、数组、类还是其他?
  • 它是一个具有多个属性的类。问题是我不想将其反序列化为临时对象,然后在新对象上设置所有属性。如果我添加一个新属性会怎样?我很想知道人们在这种情况下是否使用了任何技巧,或者我是否只是做一些事情,比如创建一个静态方法 Profile.CreateNew(filename as string) 来构造并返回对象。 (然后替换所有对 New(...) 的调用)

标签: .net vb.net json javascriptserializer


【解决方案1】:

您不能在构造函数中分配给Me。 “技巧”是可能的,比如对反序列化对象的属性进行反射,在构造函数中赋值相同的值,但是比较麻烦且不明智。

你需要一个通用的帮助方法来反序列化来自文件名的任何类型T 的实例:

Public Shared Function DeserializeFile(Of T)(filename As String) As T
    Dim JSONString As String = File.ReadAllText(filename)
    Dim j As New JavaScriptSerializer()
    Return j.Deserialize(Of T)(JSONString)
End Function

用法,如果助手在 SerializationHelper 中,并且根据您的问题,您要反序列化的类是 Profile

Dim obj As Profile = SerializationHelper.DeserializeFile(Of Profile)("filename.json")

【讨论】:

    猜你喜欢
    • 2016-09-25
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    相关资源
    最近更新 更多