【发布时间】:2018-06-14 11:02:14
【问题描述】:
我有许多类,包括对象层次结构和接口、基类等的常规设计,来自我无法修改任何代码的项目。我的项目中有另一个有效负载类,它使用组合来封装来自其他类的信息并包含有效负载类中的属性,其类型是来自其他项目的类。
现在我需要能够创建一个包含其他类实例的有效负载类的实例,并将其序列化为 Base64 字符串以进行传输。
问题是因为我无法触及其他类的代码,所以我无法添加序列化属性(对于 .NET 二进制格式化程序/protobuf-net)。我也尝试过使用没有属性的protobuf-net,但是由于对象层次太深,创建起来似乎太复杂了。
谁能告诉我在不修改现有代码的情况下继续进行序列化/反序列化部分的更好选择。
说明需求的示例代码如下所示:
void Main()
{
var b = new B();
b.SetStatus("This is B");
var c = new C { Name = "C", Value = 100};
var payload = new Payload(b, c);
var serializedData = SerializeToString<Payload>(payload);
serializedData.Dump();
}
private static TData DeserializeFromString<TData>(string settings)
{
byte[] b = Convert.FromBase64String(settings);
using (var stream = new MemoryStream(b))
{
var formatter = new BinaryFormatter();
stream.Seek(0, SeekOrigin.Begin);
return (TData)formatter.Deserialize(stream);
}
}
private static string SerializeToString<TData>(TData settings)
{
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(stream, settings);
stream.Flush();
stream.Position = 0;
return Convert.ToBase64String(stream.ToArray());
}
}
public class A
{
public string Id { get; set; }
public string StatusMsg {get;protected set;}
public virtual void SetStatus(string msg)
{
StatusMsg = msg;
}
}
public class B : A
{
public B()
{
Id = new Guid().ToString();
}
public override void SetStatus(string msg)
{
base.SetStatus(msg);
}
}
public class C
{
public string Name
{
get;
set;
}
public Int32 Value
{
get;
set;
}
}
public class Payload
{
public B PropertyB { get; set; }
public C PropertyC { get; set; }
public Payload(B b, C c)
{
this.PropertyB = b;
this.PropertyC = c;
}
}
【问题讨论】:
-
你考虑过使用JSON.NET吗?
-
@MatthewWatson 我需要一种二进制序列化的方法,因为这需要通过网络进行,而且 JSON 太大且可读性太大
-
所以只是序列化后压缩一下?
标签: c# serialization protobuf-net binary-serialization