为了传输/克隆等目的,我需要序列化任何对象(到 xml、json 等 - 不太关心)
我发现 newtonsoft.json 库使用起来非常简单,只是它不序列化私有(private)成员。我在 c# 中找到了一些示例,这些示例似乎提供了我使用契约(Contract)所需的功能,但我无法让它们工作。
我会很感激一个简单的例子:
例如
Class Person
Private _NI as integer
Public Name as string
End Class
我需要两个函数:
Function SerializePerson(P as person) as string
Function DeSerializePerson(SerializedText as string) as Person
理想情况下,我想要一种易于复制到任何对象的方法。
最佳答案
Newtonsoft 的技巧是更改 JsonSerializerSettings
并将它们传递到 JsonConvert.SerializeObject
。此答案包含此更改的全部详细信息:https://stackoverflow.com/a/24107081/2019162
编辑
我没想到链接代码是用 C# 编写的,因为我经常使用这两种语言。我很抱歉。我已经翻译了下面的代码:
Dim settings As New JsonSerializerSettings() With {.ContractResolver = New MyContractResolver()}
Dim json As String = JsonConvert.SerializeObject(obj, settings)
合约解析器:
Imports System.Reflection
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Serialization
Public Class MyContractResolver
Inherits DefaultContractResolver
Protected Overrides Function CreateProperties(type As Type, memberSerialization As MemberSerialization) As IList(Of JsonProperty)
Dim props = type.GetProperties(BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance).
Select(Function(p) MyBase.CreateProperty(p, memberSerialization)).
Union(type.GetFields(BindingFlags.Public Or BindingFlags.NonPublic Or BindingFlags.Instance).
Select(Function(f) MyBase.CreateProperty(f, memberSerialization))).ToList()
props.ForEach(Sub(p)
p.Writable = True
p.Readable = True
End Sub)
Return props
End Function
End Class
大多数代码转换器将 C# Lambda 更改为 VB.NET 中的 Function()
,但如果它们不需要返回类型,则应将其转换为 Sub()
。这可能是导致您出现问题的原因。
关于.net - VB.Net 序列化和反序列化私有(private)成员 - 简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27444616/