protobuf и Список <объект> - как сериализировать / десериализовывают?

Когда вы запускаете скрипт PHP в браузере, он будет отображаться как HTML по умолчанию. Если используемые вами книги показывают иное, то либо код, либо иллюстрация неточны. Вы можете использовать «просмотр источника» для просмотра того, что было отправлено в браузер, и вы увидите, что ваши переводы строки присутствуют.

<?php
echo "Line 1\nLine 2";
?>

Это будет отображаться в вашем браузере как:

Line 1 Line 2

Если вам нужно отправить простой текст в ваш браузер, вы можете использовать что-то вроде:

<?php
header('Content-type: text/plain');
echo "Line 1\nLine 2";
?>

Это выведет:

Line 1
Line 2
6
задан Marc Gravell 29 May 2009 в 06:21
поделиться

1 ответ

(раскрытие: я являюсь автором protobuf-net)

BinaryFormatter - сериализатор на основе метаданных; т.е. он отправляет информацию типа .NET о каждом сериализованном объекте. protobuf-net - это сериализатор на основе контрактов (двоичный эквивалент XmlSerializer / DataContractSerializer , который также отклоняет это).

В настоящее время нет механизма для транспортировки произвольные объекты, так как на другом конце не будет способа узнать, что вы отправляете; однако, если у вас есть известный набор из различных типов объектов, которые вы хотите отправить, могут быть варианты. В конвейере также есть работа, позволяющая создавать схемы, расширяемые во время выполнения (а не только атрибуты, которые фиксируются при сборке) - но это далеко не завершено.


Это не идеально, но работает ... будет проще, когда я завершу работу по поддержке схем времени выполнения:

using System;
using System.Collections.Generic;
using ProtoBuf;
[ProtoContract]
[ProtoInclude(10, typeof(DataItem<int>))]
[ProtoInclude(11, typeof(DataItem<string>))]
[ProtoInclude(12, typeof(DataItem<DateTime>))]
[ProtoInclude(13, typeof(DataItem<Foo>))]
abstract class DataItem {
    public static DataItem<T> Create<T>(T value) {
        return new DataItem<T>(value);
    }
    public object Value {
        get { return ValueImpl; }
        set { ValueImpl = value; }
    }
    protected abstract object ValueImpl {get;set;}
    protected DataItem() { }
}
[ProtoContract]
sealed class DataItem<T> : DataItem {
    public DataItem() { }
    public DataItem(T value) { Value = value; }
    [ProtoMember(1)]
    public new T Value { get; set; }
    protected override object ValueImpl {
        get { return Value; }
        set { Value = (T)value; }
    }
}
[ProtoContract]
public class Foo {
    [ProtoMember(1)]
    public string Bar { get; set; }
    public override string ToString() {
        return "Foo with Bar=" + Bar;
    }
}
static class Program {
    static void Main() {
        var items = new List<DataItem>();
        items.Add(DataItem.Create(12345));
        items.Add(DataItem.Create(DateTime.Today));
        items.Add(DataItem.Create("abcde"));
        items.Add(DataItem.Create(new Foo { Bar = "Marc" }));
        items.Add(DataItem.Create(67890));

        // serialize and deserialize
        var clone = Serializer.DeepClone(items);
        foreach (DataItem item in clone) {
            Console.WriteLine(item.Value);
        }
    }
}
11
ответ дан 9 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: