Я пишу проект для передачи объекта из родительского приложения в дочернее приложение. Я использую Protobuf для сериализации и десериализации данных. Я также использую Non-Persisted Memory-Mapped File для записи в процессе сериализации (и чтения с десериализации). Вот код:IPC Использование файлов Protobuf и Memory Mapped C#
[ProtoContract(SkipConstructor = true)]
public class Test
{
[ProtoMember(1)]
public int ID { get; private set; }
[ProtoMember(2)]
public bool TestBool { get; private set; }
[ProtoMember(3)]
public string MessageBody { get; private set; }
public Test(int id, bool testBool, string messageBody)
{
this.ID = id;
this.TestBool = testBool;
this.MessageBody = messageBody;
}
public void Serialize()
{
MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 1000);
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
Serializer.SerializeWithLengthPrefix(stream, this, PrefixStyle.Base128);
stream.Flush();
}
}
public static Test Deserialize()
{
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap"))
{
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
return Serializer.DeserializeWithLengthPrefix<Test>(stream, PrefixStyle.Base128);
}
}
}
}
//On the parent application
var msg = new SharedLibrary.Test(1234, true, "Test message hahah");
msg.Serialize();
//spawn child application
//On the child application
Test result = Test.Deserialize();
Когда я запускаю этот код я получаю следующее сообщение об ошибке (если Serializer.Deserialize называется):
Exception брошенного: 'ProtoBuf.ProtoException' в Protobuf-net.dll Дополнительная информация: Недопустимое поле в исходных данных: 0 Я думаю, что эта ошибка возникает, потому что поток больше, чем фактические данные, которые он содержит. Когда поток десериализуется, я думаю, что он начинает читать за пределами фактических данных.
Исключение брошено: «ProtoBuf.ProtoException» в Protobuf-net.dll Дополнительная информация: Нет конструктор без параметров не найдено для испытаний
Я не уверен, что лучший способ, чтобы исправить это, однако. Есть ли способ прочитать байты из потока, пока не осталось данных, а затем остановится? Если нет, я могу решить этот другой путь?
Дикое предположение, может быть, потому что свойства 'set' являются частными? Использование атрибутов может указывать на то, что используется отражение. –
Я пробовал это только для того, чтобы быть в безопасности, но эта же ошибка бросается. Я почти уверен, что Protobuf просто вызывает конструктор, поэтому это не должно быть проблемой. – user2481095
На самом деле я только что кое-что обнаружил. У меня также был конструктор по умолчанию public Test() {}. Когда я удалил это, вызывается новое исключение: Исключение выбрано: «ProtoBuf.ProtoException» в protobuf-net.dll Дополнительная информация: для Test не найдено конструктора без параметров. Таким образом, кажется, что поток, получающий Deserialize, пуст ? Не знаю, почему это произойдет. – user2481095