Sử dụng protobuf-net v2 build 668, tôi đang cố gắng tuần tự hóa/deserialize một lớp có chứa thành viên được định nghĩa là giao diện trong khi thực hiện chuyển đổi on-the-fly cùng một lúc. Thông thường, cách tiếp cận thay thế sẽ hoạt động tốt nhưng vì C# không cho phép chuyển đổi do người dùng xác định cho giao diện, tôi không thể xác định chuyển đổi.Có cách nào để xác định các hàm chuyển đổi thay thế (từ/sang giao diện) trong lớp thay thế protobuf-net
Cảm ơn,
namespace ProtoBufNetTest
{
using System.Diagnostics;
using System.IO;
using ProtoBuf;
using ProtoBuf.Meta;
class Program
{
static void Main()
{
RuntimeTypeModel.Default.Add(typeof(IDummy), false)
.SetSurrogate(typeof(DummySurrogate));
var container = new Container { Data = new Dummy { Positive = 3 } };
using (var file = File.Create("test.bin"))
{
Serializer.Serialize(file, container);
}
using (var file = File.OpenRead("test.bin"))
{
container = Serializer.Deserialize<Container>(file);
Debug.Assert(container.Data.Positive == 3);
}
}
}
// Outside of the project, cannot be changed
public interface IDummy
{
int Positive { get; set; }
}
[ProtoContract]
public class Container
{
[ProtoMember(1)]
public IDummy Data { get; set; }
}
public class Dummy : IDummy
{
public int Positive { get; set; }
}
[ProtoContract]
class DummySurrogate
{
[ProtoMember(1)]
public int Negative { get; set; }
// Does not compile : user-defined conversions to or from an interface are not allowed
public static explicit operator IDummy(DummySurrogate value)
{
return value == null ? null : new Dummy { Positive = -value.Negative };
}
// Does not compile : user-defined conversions to or from an interface are not allowed
public static explicit operator DummySurrogate(IDummy value)
{
return value == null ? null : new DummySurrogate { Negative = -value.Positive };
}
// Fake attribute, does not exist but could work if it did
[ProtoConvertFrom]
public static IDummy From(DummySurrogate value)
{
return value == null ? null : new Dummy { Positive = -value.Negative };
}
// Fake attribute, does not exist but could work if it did
[ProtoConvertTo]
public static DummySurrogate To(IDummy value)
{
return value == null ? null : new DummySurrogate { Negative = -value.Positive };
}
}
}
Chỉ cần nói: Tôi không bỏ qua bạn - do di chuyển nhà tôi đã giới hạn thời gian sử dụng máy tính hiện nay. Sẽ lấy lại cho bạn càng sớm càng tốt –
Cảm ơn Marc. Chúc may mắn với sự di chuyển. –