.net - VB.Net 序列化和反序列化私有(private)成员 - 简单示例

标签 .net vb.net object serialization private-members

为了传输/克隆等目的,我需要序列化任何对象(到 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/

相关文章:

c# - .NET 中的哪些数据结构在 Contains() 调用上执行 O(1)?

javascript - 函数参数测试类型

javascript - 函数如何适应传递不同对象作为参数的调用?

javascript - 当我不知道按钮名称时,如何让多个按钮调用相同的功能?

c# - 从 native C++ 调用 C#,没有/clr 或 COM?

c# - 从 DataTable 中删除重复项并自定义 IEqualityComparer<DataRow>

vb.net - vb2005有没有简单的方法将MP3转为WAV?

mysql - 如何从 SQLDataSource 中过滤数据

php - 你如何验证一个属性是否可以在 php 中访问?

.net - 我可以将 32 位 DLL 加载到 Windows 上的 64 位进程中吗?